我在Python中有两个迭代项,我想把它们成对地介绍一下:
foo = (1, 2, 3)
bar = (4, 5, 6)
for (f, b) in some_iterator(foo, bar):
print "f: ", f, "; b: ", b
它应导致:
f: 1; b: 4
f: 2; b: 5
f: 3; b: 6
一种方法是迭代索引:
for i in xrange(len(foo)):
print "f: ", foo[i], "; b: ", b[i]
但这在我看来有点不自然。 有没有更好的办法做这件事?
for f, b in zip(foo, bar):
print(f, b)
当foo
或bar
中较短者停止时,zip
停止。
在Python3中,zip
返回元组迭代器,就像Python2中的itertools.izip
。 要获取元组列表,请使用list(zip(foo,bar))
。 并且要压缩直到两个迭代器都用完,您可以使用itertools.zip_longth。
在Python2中,zip
返回元组列表。 当foo
和bar
不是很大时,这很好。 如果它们都是大量的,那么形成的zip(foo,bar)
是一个不必要的大量临时变量,应该由itertools.izip
或itertools.izip_longth
替换,后者返回迭代器而不是列表。
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)
当foo
或bar
耗尽时,izip
停止。 当foo
和bar
都用完时,izip_longth
停止。 当较短的迭代器耗尽时,izip_longth
生成一个元组,其中none
位于与该迭代器对应的位置。 如果愿意,除了none
之外,还可以设置不同的fillvalue
。 完整的故事请看这里。
还要注意,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
您需要zip
函数。
for (f,b) in zip(foo, bar):
print "f: ", f ,"; b: ", b
你应该使用'zip'函数。 下面是您自己的zip函数的示例
def custom_zip(seq1, seq2):
it1 = iter(seq1)
it2 = iter(seq2)
while True:
yield next(it1), next(it2)