我在Python中有兩個可迭代的對象,我想成對地遍歷它們: html
foo = (1, 2, 3) bar = (4, 5, 6) for (f, b) in some_iterator(foo, bar): print "f: ", f, "; b: ", b
它應致使: python
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]
但這對我來講彷佛有些難以想象。 有更好的方法嗎? spa
您須要zip
功能。 code
for (f,b) in zip(foo, bar): print "f: ", f ,"; b: ", b
for f, b in zip(foo, bar): print(f, b)
當foo
或bar
的較短者中止時, zip
中止。 orm
在Python 3中 , zip
返回一個元組的迭代器,就像Python2中的itertools.izip
同樣。 要獲取元組列表,請使用list(zip(foo, bar))
。 要壓縮直到兩個迭代器都用盡,能夠使用itertools.zip_longest 。 htm
在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)
當foo
或bar
用盡時, izip
中止。 當foo
和bar
都用盡時, izip_longest
中止。 當較短的迭代器用盡時, izip_longest
在與該迭代器相對應的位置生成一個None
的元組。 若是須要,您還能夠設置除None
之外的其餘fillvalue
。 看到這裏的完整故事 。 索引
還要注意的是zip
及zip
式的brethen能夠接受iterables做爲參數的任意數量。 例如, ip
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 」功能。 這是您本身的zip函數的外觀示例
def custom_zip(seq1, seq2): it1 = iter(seq1) it2 = iter(seq2) while True: yield next(it1), next(it2)
如下是使用列表理解的方法:
a = (1, 2, 3) b = (4, 5, 6) [print('f:', i, '; b', j) for i, j in zip(a, b)]
印刷品:
f: 1 ; b 4 f: 2 ; b 5 f: 3 ; b 6
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