for f, b in zip(foo, bar):
print(f, b)
zip
останавливается, когда короче foo
или bar
остановок.
В Python 2, zip
возвращает список кортежей. Это нормально, когда foo
и bar
не массивны. Если они оба массивные, то формирование zip(foo,bar)
является излишне массивной временной переменной и должно быть заменено на itertools.izip
или itertools.izip_longest
, которое возвращает итератор вместо списка.
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
останавливается, когда либо foo
или bar
исчерпан. izip_longest
останавливается, когда погашены как foo
, так и bar
. Когда более короткий итератор (ы) исчерпан, izip_longest
дает кортеж с None
в положении, соответствующем этому итератору. Вы также можете установить другой fillvalue
, кроме None
, если хотите. См. Здесь full story.
В Python 3, zip
возвращает итератор кортежей, как itertools.izip
в python2. Чтобы получить список кортежей, используйте list(zip(foo, bar))
. И чтобы застегнуть молнию до тех пор, пока оба итератора не будут исчерпаны, вы должны использовать itertools.zip_longest.
Отметим также, что zip
и его zip
-как brethen может принимать произвольное число итерируемыми в качестве аргументов.Например,
for num, cheese, color in zip([1,2,3], ['manchego', 'stilton', 'brie'],
['red', 'blue', 'green']):
print('{} {} {}'.format(num, color, cheese))
печатает
1 red manchego
2 blue stilton
3 green brie
@unutbu В Python 3 имя функции - 'itertools.zip_longest', вместо' itertools.izip_longest' (в основном 'zip ...' вместо 'izip ...' в модуле 'itertools'). Это редактирование одного персонажа, иначе я бы отредактировал супер незначительную коррекцию в вашем ответе. –
@MichaelA: Спасибо за исправление. – unutbu
@unutbu Почему я предпочитаю метод OP над 'izip' (даже если' izip'/'zip' выглядит намного чище)? – armundle