python - 如何并行遍历两个列表?

标签 python list for-loop iterator

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

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

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

最佳答案

Python 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 .

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)

izipfoobar 用尽时停止。 当 foobar 都用尽时,izip_longest 停止。 当较短的迭代器用尽时,izip_longest 会生成一个元组,其中 None 在对应于该迭代器的位置。您还可以根据需要设置除 None 之外的其他 fillvalue。见这里full story .


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

关于python - 如何并行遍历两个列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1663807/

相关文章:

php - 使用 PHPExcel 循环工作表

r - 从 r 中的数据帧中制作大小为 n/2 和 2 列的列表

for-loop - 程序在完成之前退出 - for 循环中的并发问题 - goroutine 不工作

python - 使用MySQLdb更新表时出错

python - 如何在 python 中使用多个索引同时填充 numpy 数组

python - 如何将列表中的所有数字相乘以显示新列表?

python,随机播放直到列表完全不同

c++ - 无法理解此代码中使用的 for 循环

python - Pandas XlsxWriter 导出到新文件夹

python - 在 Python 中匹配 2 个正则表达式