我在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)
zip
在foo
或bar
的较短者停止时停止。
在Python 3中,zip
返回一个图元的迭代器,就像Python2中的itertools.izip
。
图元的列表,使用list(zip(foo, bar))
。而要压缩到两个迭代器都用完
穷尽,你可以使用
itertools.zip_longest。
在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'。请看这里的完整故事。
还需要注意的是,zip
和它的zip
类似的分支可以接受任意数量的iterable作为参数。比如说。
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
[与任何python版本][1]。
while a and b: # condition may change when length not equal
ae, be = a.pop(0), b.pop(0)
print(f"{ae} {be}") # check if None
[1]: https://docs.python.org/2.7/tutorial/datastructures.html