有没有办法实现并行的for-each循环?

11 投票
3 回答
3436 浏览
提问于 2025-04-16 01:10

假设我在Python中有两个列表,我想要同时遍历这两个列表。比如说,对两个列表的第一个元素做一些操作,然后对第二个元素做一些操作……我知道可以通过使用索引来实现:

for listIndex in range(len(list1)):
   doSomething(list1[listIndex])
   doSomething(list2[listIndex])

但是有没有更直观的方法,比如用一个foreach循环?类似于 for list1Value in list1, list2Value in list2 这样的写法……?

我现在在Python中遇到了这个情况,但这个问题已经存在很久了,我也想知道在其他语言中是否可以这样做。(我只是觉得Python可能最有可能有处理这个问题的方法。)

3 个回答

4

这要看你使用的编程语言。其实,Python有一个相对简单的方法来实现这个功能:

a = (0,1,2,3,4,5,6,7,8,9)
b = "ABCDEFGHIJ"
for pair in zip(a,b):
  print("%d => %s" % pair)
4

可以使用 zipitertools.izip 来实现这个功能:

for item1, item2 in zip(iterable1, iterable2):
    # process the items in parallel

在 Python 3 之前,itertools.izip 和在 Python 3 及之后的 zip 都会返回一个迭代器,也就是说,它们会根据需要提供成对的元组(或者三元组、四元组等等)。而在 Python 3 之前,zip 会创建一个元组列表,这样如果最短的序列很长,就会占用比较多的内存。

14

像这样吗?

for (a,b) in zip(list1, list2):
  doSomething(a)
  doSomething(b)

不过,如果 doSomething() 这个函数没有进行输入输出操作,也没有改变全局状态,只是一次处理一个元素,那么执行的顺序就不重要了,这时候你可以直接使用 chain()(来自 itertools 库):

for x in chain(list1, list2):
  doSomething(x)

顺便提一下,我经常使用 from itertools import *。可以考虑用 izip() 来替代我之前提到的 zip()。还有 izip_longest()izip(count(), lst) 等等。欢迎来到函数式编程的世界。:-)

哦,对了,zip 也可以处理更多的“列”:

for idx, a, b, c in izip(count(), A, B, C):
  ...

撰写回答