Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich einen Iterator in Python effizient aufteilen?

Wie kann ich einen Iterator in Python effizient aufteilen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-29 08:51:10970Durchsuche

How Can I Efficiently Chunk an Iterator in Python?

Iteratoren in Blöcken iterieren

Stellen Sie sich ein Szenario vor, in dem Sie einen Iterator l = [1, 2, 3, 4, 5, 6 , 7] und möchten es in Blöcke der Größe 3 unterteilen, was zu einem Iterator führt, der [[1, 2, 3], [4, 5, 6], [7]].

itertools-Lösung

Die Python-Standardbibliothek bietet eine praktische Lösung innerhalb des itertools-Moduls:

import itertools

def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
    """Collect data into non-overlapping fixed-length chunks or blocks."""

    args = [iter(iterable)] * n
    if incomplete == 'fill':
        return zip_longest(*args, fillvalue=fillvalue)
    elif incomplete == 'strict':
        return zip(*args, strict=True)
    elif incomplete == 'ignore':
        return zip(*args)
    else:
        raise ValueError('Expected fill, strict, or ignore')

chunks = list(grouper(l, 3))  # Output: [[1, 2, 3], [4, 5, 6], [7]]

Erweiterte Version der Standardbibliothek

Eine spezielle Funktion, Batched, eingeführt in neueren Versionen der itertools-Rezepte, erfüllt genau diese Chunking-Anforderung:

from itertools import batched

chunks = list(batched(l, 3))  # Output: [[1, 2, 3], [4, 5, 6], [7]]

Nicht-allgemeine Lösung

Speziell für Sequenzen ein einfacherer Ansatz Die letzten Brocken effektiv verarbeiten ist:

chunks = [my_list[i:i + chunk_size] for i in range(0, len(my_list), chunk_size)]

Das obige ist der detaillierte Inhalt vonWie kann ich einen Iterator in Python effizient aufteilen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn