如何并行迭代两个列表?

2024-04-26 18:58:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个Python中的iterables,我想两人一组地讨论它们:

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]

但这对我来说有点不合逻辑。有更好的办法吗?


Tags: 方法inforlenfoobarsomeprint
3条回答

您需要zip函数。

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

Python3

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

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

在Python 3中,^{} 返回元组的迭代器,如Python2中的itertools.izip。得到一份清单 对于元组,使用list(zip(foo, bar))。压缩,直到两个迭代器都 筋疲力尽,你会用 itertools.zip_longest

Python2

在Python 2中,^{} 返回元组列表。当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停止。 izip_longest在耗尽foobar时停止。 当较短的迭代器耗尽时,izip_longest产生一个元组,其中None位于该迭代器对应的位置。如果您愿意,还可以设置一个不同的fillvalueNone。请看这里的full story


还要注意zip及其类似于zip的brethen可以接受任意数量的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

您应该使用zip函数。下面是一个示例,说明您自己的zip函数的外观

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

相关问题 更多 >