这个问题与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
