提问者:小点点

如何并行迭代两个列表?


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

但这在我看来有点不自然。 有没有更好的办法做这件事?


共3个答案

匿名用户

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

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

在Python3中,zip返回元组迭代器,就像Python2中的itertools.izip。 要获取元组列表,请使用list(zip(foo,bar))。 并且要压缩直到两个迭代器都用完,您可以使用itertools.zip_longth。

在Python2中,zip返回元组列表。 当foobar不是很大时,这很好。 如果它们都是大量的,那么形成的zip(foo,bar)是一个不必要的大量临时变量,应该由itertools.izipitertools.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)

foobar耗尽时,izip停止。 当foobar都用完时,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)