for f, b in zip(foo, bar):
print(f, b)
zip
stoppt, wenn die kürzere foo
oder bar
stoppt.
In Python 2, zip
gibt eine Liste von Tupeln. Dies ist in Ordnung, wenn foo
und bar
nicht massiv sind. Wenn sie beide massiv sind dann zip(foo,bar)
ist eine unnötig massive temporäre Variable, und sollte durch itertools.izip
oder itertools.izip_longest
ersetzt werden, die einen Iterator anstelle einer Liste zurückgibt.
import itertools
for f,b in itertools.izip(foo,bar):
print(f,b)
for f,b in itertools.izip_longest(foo,bar):
print(f,b)
izip
stoppt, wenn entweder foo
bar
oder erschöpft ist. izip_longest
stoppt, wenn sowohl foo
als auch bar
erschöpft sind. Wenn die kürzeren Iteratoren erschöpft sind, ergibt izip_longest
ein Tupel mit None
in der Position, die diesem Iterator entspricht. Sie können auch einen anderen fillvalue
neben None
setzen, wenn Sie möchten. Siehe hier für die full story.
In Python 3, zip
gibt einen Iterator von Tupeln, wie in itertools.izip
Python2. Um eine Liste von Tupeln zu erhalten, verwenden Sie list(zip(foo, bar))
. Und um zu zippen, bis beide Iteratoren erschöpft sind, würden Sie itertools.zip_longest verwenden.
Beachten Sie auch, dass zip
und seine zip
-ähnlichen brethen kann eine beliebige Anzahl von Iterables als Argumente akzeptieren.Zum Beispiel
for num, cheese, color in zip([1,2,3], ['manchego', 'stilton', 'brie'],
['red', 'blue', 'green']):
print('{} {} {}'.format(num, color, cheese))
druckt
1 red manchego
2 blue stilton
3 green brie
@unutbu In Python 3 lautet der Funktionsname 'itertools.zip_longest' anstelle von' itertools.izip_longest' (im Prinzip 'zip ...' anstelle von 'izip ...' im 'itertools' Modul). Es ist eine Ein-Zeichen-Bearbeitung, sonst würde ich die super-kleine Korrektur selbst in deine Antwort schreiben. –
@MichaelA: Danke für die Korrektur. – unutbu
@unutbu Warum sollte ich die Methode von OP gegenüber der izip bevorzugen (obwohl die 'izip /' zip' viel sauberer aussieht)? – armundle