Iterate über alle Paare aufeinander folgender Elemente in einer Liste

Eine Liste gegeben

l = [1, 7, 3, 5] 

Ich möchte über alle Paare aufeinanderfolgender Listenelemente (1,7), (7,3), (3,5) iterieren, dh

 for i in xrange(len(l) - 1): x = l[i] y = l[i + 1] # do something 

Ich würde das gerne kompakter machen, wie

 for x, y in someiterator(l): ... 

Gibt es eine Möglichkeit, dies mit integrierten PythonIteratoren zu tun? Ich bin sicher, dass das itertools Modul eine Lösung haben sollte, aber ich kann es einfach nicht herausfinden.

Solutions Collecting From Web of "Iterate über alle Paare aufeinander folgender Elemente in einer Liste"

Benutze einfach den Reißverschluss

 >>> l = [1, 7, 3, 5] >>> for first, second in zip(l, l[1:]): ... print first, second ... 1 7 7 3 3 5 

Wie bereits erwähnt, sollten Sie die izip function in itertools für sehr lange Listen verwenden, in denen Sie keine neue Liste erstellen möchten.

 import itertools for first, second in itertools.izip(l, l[1:]): ... 

Schauen Sie pairwise bei itertools Rezepte: http://docs.python.org/2/library/itertools.html#recipes

Zitat von dort:

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

Eine allgemeine Version

Eine allgemeine Version, die Tupel jeder beliebigen positiven natürlichen Größe ergibt, könnte folgendermaßen aussehen:

 def nwise(iterable, n=2): iters = tee(iterable, n) for i, it in enumerate(iters): next(islice(it, i, i), None) return izip(*iters) 

Ich würde einen generischen grouper Generator wie diesen erstellen

 def grouper(input_list, n = 2): for i in xrange(len(input_list) - (n - 1)): yield input_list[i:i+n] 

Probenlauf 1

 for first, second in grouper([1, 7, 3, 5, 6, 8], 2): print first, second 

Ausgabe

 1 7 7 3 3 5 5 6 6 8 

Probenlauf 1

 for first, second, third in grouper([1, 7, 3, 5, 6, 8], 3): print first, second, third 

Ausgabe

 1 7 3 7 3 5 3 5 6 5 6 8 

Du könntest einen zip benutzen.

 >>> list(zip(range(5), range(2, 6))) [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5)] 

Genau wie ein Reißverschluss, schafft es Paare. Um also Ihre zwei Listen zu mischen, erhalten Sie:

 >>> l = [1,7,3,5] >>> list(zip(l[:-1], l[1:])) [(1, 7), (7, 3), (3, 5)] 

Dann geht das Iterieren wie

 for x, y in zip(l[:-1], l[1:]): pass 

Was ist unten ist sehr einfach / lesbar und macht diese Arbeit, wahrscheinlich auch die effizienteste.

Liste in Generator umwandeln (oder besser mit einem Iterator beginnen, um mit zu beginnen):

 gen = (x for x in l) 

Konvertieren Sie es in Paare:

 [(x, gen.next()) for x in gen] 

Das ist alles was du brauchst.

Natürlich, mach es besser zum Generator und lies daraus, wie du brauchst:

 ( (x, gen.next()) for x in gen)