Wie kann man durch zwei Listen parallel iterieren?
Ich habe zwei Iterables in Python, und ich möchte sie paarweise durchgehen:
foo = (1, 2, 3)
bar = (4, 5, 6)
for (f, b) in some_iterator(foo, bar):
print "f: ", f, "; b: ", b
Das Ergebnis sollte sein:
f: 1; b: 4
f: 2; b: 5
f: 3; b: 6
Eine Möglichkeit ist, über die Indizes zu iterieren:
for i in xrange(len(foo)):
print "f: ", foo[i], "; b: ", b[i]
Aber das erscheint mir etwas unpythonisch. Gibt es einen besseren Weg?
758
3
Python 3
zip
hört auf, wenn die kürzere der beiden Variantenfoo
oderbar
aufhört.In Python 3 gibt
zip
einen Iterator von Tupeln zurück, wieitertools.izip
in Python2. Um eine Liste von Tupeln zu erhalten, verwenden Sielist(zip(foo, bar))
. Und um zu zippen, bis beide Iteratoren erschöpft sind erschöpft sind, würden Sie verwenden itertools.zip_longest.Python 2
In Python 2 gibt
zip
eine Liste von Tupeln zurück. Das ist in Ordnung, wennfoo
undbar
nicht massiv sind. Wenn sie beide massiv sind, dann ist die Bildung vonzip(foo,bar)
eine unnötig massive temporäre Variable und sollte ersetzt werden durchitertools.izip
oderitertools.izip_longest
ersetzt werden, das einen Iterator statt einer Liste zurückgibt.izip
hält an, wenn entwederfoo
oderbar
erschöpft ist.izip_longest
hört auf, wenn sowohlfoo
als auchbar
erschöpft sind. Wenn der/die kürzere(n) Iterator(en) erschöpft sind, liefertizip_longest
ein Tupel mitNone
an der Position, die diesem Iterator entspricht. Sie können auch einen anderenFüllwert
alsNone
setzen, wenn Sie wollen. Siehe hier für die vollständige Geschichte.Beachten Sie auch, dass
zip
und seinezip
-ähnlichen Abkömmlinge eine beliebige Anzahl von Iterablen als Argumente akzeptieren können. Zum Beispiel,druckt
Sie benötigen die Funktion
zip
.Sie sollten die Funktion 'zip' verwenden. Hier ist ein Beispiel, wie Ihre eigene zip-Funktion aussehen kann