如何并行循环访问两个列表?

2022-09-05 01:03:40

我有两个可迭代对象,我想成对介绍它们:

foo = [1, 2, 3]
bar = [4, 5, 6]

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

这应该会导致:

f: 1; b: 4
f: 2; b: 5
f: 3; b: 6

种方法是迭代索引:

for i in range(len(foo)):
    print("f: ", foo[i], "; b: ", bar[i])

但这对我来说似乎有些不合时宜。有没有更好的方法来做到这一点?


答案 1

蟒蛇 3

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

zip在 较短的 或 停止时停止。foobar

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

Python 2

Python 2 中,zip 返回元组列表。当并且不是巨大的时,这很好。如果它们都是巨大的,那么形成是一个不必要的大临时变量,应该替换为 or ,它返回迭代器而不是列表。foobarzip(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)

izip在任一或用尽时停止。 当两者都用尽时停止。当较短的迭代器用尽时,将生成一个元组,其位置与该迭代器相对应。如果您愿意,您还可以设置不同的。有关完整故事,请参阅此处。foobarizip_longestfoobarizip_longestNonefillvalueNone


还要注意,它的 -like brethen 可以接受任意数量的可迭代对象作为参数。例如zipzip

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

答案 2

您需要该函数。zip

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