Skip to main content
 首页 » 编程设计

Python:同时运行的循环,两个还是更多

2025年05月04日12bonelee

这个问题与How do I run two python loops concurrently?密切相关

我会以更清晰的方式表达: 我得到了提问者在上面的链接中提出的问题,比如

for i in [1,2,3], j in [3,2,1]: 
    print i,j 
    cmp(i,j) #do_something(i,j) 

但是

L1:对于 [1,2,3] 中的 i 和 [3,2,1] 中的 j: 不工作

Q1。 但这里发生的事情很有趣:

    for i in [1,2,3], j in [3,2,1]: 
    print i,j 
 
 
[1, 2, 3] 0 
False 0 

Q2。如何让 L1 之类的东西发挥作用?

不是真正的多线程或并行。 (是两个并发的任务,不是一个循环中的一个循环)然后比较两者的结果。

这里的列表是数字。我的情况不是数字:

for i in f_iterate1() and j in f_iterate2(): 

更新:下面的 abarnert 是正确的,我在某处定义了 j。所以现在是:

>>> for i in [1,2,3], j in [3,2,1]: 
    print i,j 
 
 
 
Traceback (most recent call last): 
  File "<pyshell#142>", line 1, in <module> 
    for i in [1,2,3], j in [3,2,1]: 
NameError: name 'j' is not defined 

而且我不想压缩两个迭代函数!但是在类似 for 循环的情况下同时处理它们。问题仍然是如何在 python 中实现它。

更新 #2:解决了相同长度的列表

>>> def a(num): 
    for x in num: 
        yield x 
 
 
>>> n1=[1,2,3,4] 
>>> n2=[3,4,5,6] 
>>> x1=a(n1) 
>>> x2=a(n2) 
>>> for i,j in zip(x1,x2): 
    print i,j 
 
 
1 3 
2 4 
3 5 
4 6 
>>>  

[已解决]

Q3. What if n3=[3,4,5,6,7,8,78,34] which is greater than both n1,n2. zip wont work here.something like izip_longest? izip_longest works good enough.

请您参考如下方法:

很难理解你在问什么,但我认为你只是想要 zip :

for i, j in zip([1,2,3], [3,2,1]): 
    print i, j 
 
for i, j in zip(f_iterate1(), f_iterate2()): 
    print i, j 

等等……

这不会并发做任何事情,因为这个术语通常被使用,它一次只做一件事,但那一件事就是“以锁步方式迭代两个序列”。


请注意,这以明显的方式扩展到三个或更多列表:

for i, j, k in zip([1,2,3], [3,2,1], [13, 22, 31]): 
    print i, j, k 

(如果您甚至不知道自己有多少个列表,请查看评论。)


如果您想知道这是怎么回事:

for i in [1,2,3], j in [3,2,1]: 
    print i,j 

试试这个:

print [1,2,3], j in [3,2,1] 

如果您已经在某处定义了 j,它将打印 [1, 2, 3] False 或 [1, 2, 3] True 。否则,您将得到一个 NameError。那是因为您只是创建了一个包含两个值的元组,第一个是列表 [1,2,3],第二个是表达式 j in [3, 2,1]。

所以:

j=0 
for i in [1,2,3], j in [3,2 1]: 
    print i, j 

……等同于:

j=0 
for i in ([1,2,3], False): 
    print i, 0 

... 将打印:

[1, 2, 3] 0 
False 0