如何并行遍历两个列表?

新手上路,请多包涵

我有两个可迭代对象,我想成对检查它们:

 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])

但这对我来说似乎有点不合时宜。有更好的方法吗?

原文由 Nathan Fellman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 486
2 个回答

蟒蛇 3

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

zipfoobar 中较短者停止时停止。

Python 3 中, zip 返回元组的迭代器,如 Python2 中的 itertools.izip 。要获取元组列表,请使用 list(zip(foo, bar)) 。要压缩直到两个迭代器都用完,您将使用 itertools.zip_longest

蟒蛇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)

izipfoobar 用尽时停止。 izip_longestfoobar 都用尽时停止。当较短的迭代器用尽时, izip_longest 产生一个元组,其中 None 在对应于该迭代器的位置。您还可以根据需要设置不同的 fillvalue 除了 None完整的故事 请看这里。


还要注意 zip 和它的 zip -like 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

原文由 unutbu 发布,翻译遵循 CC BY-SA 4.0 许可协议

您需要 zip 功能。

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

原文由 Karl Guertin 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题