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

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

<小时/>

相关任务:
<子>* How to merge lists into a list of tuples? - 给定上面的 foobar,创建列表 [(1, 4), (2, 5), (3, 6)].
<子>* How can I make a dictionary (dict) from separate lists of keys and values? - 创建字典 {1: 4, 2: 5, 3: 6}
<子>* Create a dictionary with comprehension - 在字典理解中使用 zip 构造 dict

最佳答案

Python 3

for f, b in zip(foo, bar):
    print(f, b)
foobar 中较短者停止时,

zip 停止。

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)
foobar 耗尽时,

izip 停止。 当 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/54862692/

相关文章:

python - 纬度、经度和 RSSI 转 3D 图形

python - BeautifulSoup 第一个元素不正确

Python字符串分割连接4

C# 参数计数不匹配将列表转换为数据表

python - 检查字符串列表中的字符子集是否包含在另一个字符串列表中

javascript - 这是在 JavaScript 中使用两个循环的正确方法吗

sql - ORA-01427 : single-row subquery returns more than one row in Update Statement

Python:如何改变字典值的子集?

python - += 运算符在 Python 中是线程安全的吗?

java - Python 服务器只从 Java 客户端接收一个字符?