Heim >Backend-Entwicklung >Python-Tutorial >Wie kann ich überlappende Paare (oder Tripel) in einer Python-Liste effizient iterieren?

Wie kann ich überlappende Paare (oder Tripel) in einer Python-Liste effizient iterieren?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-16 21:23:11798Durchsuche

How Can I Efficiently Iterate Over Overlapping Pairs (or Triples) in a Python List?

Iterieren über überlappende Wertepaare in Python

Das Iterieren über eine Liste in Python unter Berücksichtigung sowohl des „aktuellen“ als auch des „nächsten“ Elements ist ein gemeinsames Bedürfnis. Traditionell wird dies mit Code wie dem folgenden erreicht:

for current, next in zip(the_list, the_list[1:]):
    # Do something

Dieser Ansatz ist zwar effektiv, aber nicht der idiomatischste oder effizienteste. Eine eher pythonische Lösung ist die Verwendung der Pairwise-Funktion aus dem itertools-Modul:

import itertools

def pairwise(iterable):
    "s -> (s0, s1), (s1, s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)

Die Pairwise-Funktion erstellt zwei parallele Iteratoren, a und b, die beide auf das erste Element des ursprünglichen Iterables zeigen. Dann rückt es b um einen Schritt weiter, was dazu führt, dass a auf s0 und b auf s1 zeigt. Die Zip-Funktion paart dann die Elemente von a und b, sodass Sie überlappende Paare erhalten.

Für Python 2 können Sie itertools.izip anstelle von zip verwenden, um einen Lazy-Iterator zu erhalten:

import itertools

def pairwise(iterable):
    "s -> (s0, s1), (s1, s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

Diese Technik kann erweitert werden, um mithilfe des n-Parameters der Tee-Funktion größere „Fenster“ zu erzeugen. Um beispielsweise Tripel zu erzeugen, können Sie Folgendes verwenden:

def threes(iterator):
    "s -> (s0, s1, s2), (s1, s2, s3), (s2, s3, 4), ..."
    a, b, c = itertools.tee(iterator, 3)
    next(b, None)
    next(c, None)
    next(c, None)
    return zip(a, b, c)

Beachten Sie, dass die Verwendung von tee Speicher verbrauchen kann, wenn einer der Iteratoren weiter vorrückt als die anderen. In Fällen, in denen die Iteratoren jedoch im gleichen Tempo voranschreiten, ist dieser Ansatz speichereffizient und idiomatisch.

Das obige ist der detaillierte Inhalt vonWie kann ich überlappende Paare (oder Tripel) in einer Python-Liste effizient iterieren?. 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