如何并行地遍历两个列表?

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]

答案

Python 3

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

foobar的较短者停止时, zip停止。

Python 3 中zip返回一个元组的迭代器,就像 Python2 中的itertools.izip一样。要获取元组列表,请使用list(zip(foo, bar)) 。要压缩直到两个迭代器都用尽,可以使用itertools.zip_longest

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 。看到这里的完整故事


还要注意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

您需要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)

这是使用列表理解的方法:

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

Python3 参考

itertools - 创建用于高效循环的迭代器的函数

多处理

from itertools import zip_longest
from multiprocessing.dummy import Pool as ThreadPool

try:
    l1 = [1, 2, 3, 4, 5, 6, 7]
    l2 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']

    def f(x):
        print(x)

    pool = ThreadPool()
    zipped = list(zip_longest(l1, l2, fillvalue='na'))
    results = pool.map(f, zipped)
    pool.close()
    pool.join()    
except Exception as e:
    print(e)