for f, b in zip(foo, bar):
print(f, b)
zip
zatrzymuje się, gdy krótszy foo
lub bar
przystankami.
W Python 2, zip
zwraca listę krotek. To jest w porządku, gdy foo
i bar
nie są masywne. Jeśli są one masywne, utworzenie zip(foo,bar)
jest niepotrzebnie masywną zmienną tymczasową i powinno być zastąpione przez itertools.izip
lub itertools.izip_longest
, która zwraca iterator zamiast listy.
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
zatrzymuje się, gdy albo foo
lub bar
jest wyczerpana. izip_longest
zatrzymuje się po wyczerpaniu obu foo
i bar
. Gdy krótszy iterator (y) są wyczerpane, izip_longest
daje krotkę z None
w pozycji odpowiadającej temu iteratorowi. Możesz także ustawić inny fillvalue
oprócz None
, jeśli chcesz. Zobacz tutaj dla full story.
W Pythonie 3, zip
Zwraca iteratorem krotki jak itertools.izip
w python2. Aby uzyskać listę krotek, użyj . Aby zamakać, aż oba moduły będą wyczerpane, należy użyć itertools.zip_longest.
Należy również zauważyć, że zip
i jego zip
-jak brethen może przyjąć dowolną liczbę iterables jako argumenty.Na przykład,
for num, cheese, color in zip([1,2,3], ['manchego', 'stilton', 'brie'],
['red', 'blue', 'green']):
print('{} {} {}'.format(num, color, cheese))
drukuje
1 red manchego
2 blue stilton
3 green brie
@unutbu W Pythonie 3 nazwa funkcji to 'itertools.zip_longest', zamiast' itertools.izip_longest' (w zasadzie 'zip ...' zamiast 'izip ...' w module 'itertools'). Jest to edycja jednoznakowa, w przeciwnym razie sam edytowałbym bardzo małą korektę w twojej odpowiedzi. –
@MichaelA: Dzięki za poprawkę. – unutbu
@unutbu Dlaczego miałbym preferować metodę OP na 'izip'u (nawet jeśli' izip'/'zip' wygląda znacznie czystiej)? – armundle