如何並行遍歷兩個列表?

我在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


#1樓

您須要zip功能。 code

for (f,b) in zip(foo, bar):
    print "f: ", f ,"; b: ", b

#2樓

Python 3

for f, b in zip(foo, bar):
    print(f, b)

foobar的較短者中止時, zip中止。 orm

Python 3中zip返回一個元組的迭代器,就像Python2中的itertools.izip同樣。 要獲取元組列表,請使用list(zip(foo, bar)) 。 要壓縮直到兩個迭代器都用盡,能夠使用itertools.zip_longesthtm

Python 2

Python 2中zip返回一個元組列表。 當foobar不大時,這很好。 若是它們都是大量的,則造成zip(foo,bar)是沒必要要的大量臨時變量,應將其替換爲itertools.izipitertools.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)

foobar用盡時, izip中止。 當foobar都用盡時, izip_longest中止。 當較短的迭代器用盡時, izip_longest在與該迭代器相對應的位置生成一個None的元組。 若是須要,您還能夠設置除None之外的其餘fillvalue 。 看到這裏的完整故事索引


還要注意的是zipzip式的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

#3樓

您應該使用「 zip 」功能。 這是您本身的zip函數的外觀示例

def custom_zip(seq1, seq2):
    it1 = iter(seq1)
    it2 = iter(seq2)
    while True:
        yield next(it1), next(it2)

#4樓

如下是使用列表理解的方法:

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

#5樓

與任何python版本

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
相關文章
相關標籤/搜索