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
,它将返回一个迭代器而不是一个列表。当任一或foo
bar
耗尽
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
停止。 当较短的迭代器耗尽时,izip_longest
会在与该迭代器相对应的位置产生一个元组None
。如果您愿意,您还可以设置除None
之外的其他fillvalue
。看到这里的。
在Python 3中,zip
返回的元组的迭代器,像在Python2 itertools.izip
。要获取元组的列表 ,请使用list(zip(foo, bar))
。并且要压缩,直到两个迭代器都被耗尽,您将使用 itertools.zip_longest。
还要注意zip
及其zip
样brethen可以接受iterables作为参数的任意数量。例如,
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 ...'而不是'itertools'模块中的'izip ...')。这是一个单独的字符编辑,否则我会自己编辑超级小调整到你的答案中。 – 2014-10-15 20:04:21
@MichaelA:感谢您的纠正。 – unutbu 2014-10-15 20:25:11
@unutbu为什么我会更喜欢OP的方法而不是'izip'(即使'izip' /'zip'看起来更干净)? – armundle 2016-03-14 19:23:08