我有两个可迭代对象,我想成对检查它们:
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)
zip
在 foo
或 bar
中较短者停止时停止。
在 Python 3 中,zip
返回元组的迭代器,如 Python2 中的 itertools.izip
。获取列表
元组,使用 list(zip(foo, bar))
。并压缩直到两个迭代器都
筋疲力尽,你会用
itertools.zip_longest .
Python 2
在 Python 2 中,zip
返回一个元组列表。当 foo
和 bar
不是很大时,这很好。如果它们都是巨大的,那么形成 zip(foo,bar)
是不必要的巨大
临时变量,应替换为 itertools.izip
或
itertools.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
在 foo
或 bar
用尽时停止。
当 foo
和 bar
都用尽时,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/