【发布时间】:2013-05-14 20:45:29
【问题描述】:
这个问题与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: 不工作
第一季度。 但这很有趣:
for i in [1,2,3], j in [3,2,1]:
print i,j
[1, 2, 3] 0
False 0
第二季度。如何让 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
>>>
[已解决]
第三季度。如果 n3=[3,4,5,6,7,8,78,34] 大于 n1,n2 怎么办。 zip 在这里不起作用。像 izip_longest 之类的东西? izip_longest 足够好。
【问题讨论】:
-
在您编辑之后,我完全不明白您在问什么。两个答案都向您展示了如何同时处理它们。在
for循环的每次迭代中,每个迭代器都有一个值,您可以在同一个表达式中一起使用它们。正是你想用你的“L1”做什么。那么……您要解决的进一步问题是什么? -
至于更新的其他部分......你不明白为什么你会在这里得到一个
NameError,或者为什么你在定义j时得到你之前的输出? -
你能显示你想从给定的输入中得到什么输出吗?我们不明白你想要达到什么目的。
-
是的,
izip_longest()将在一个列表较长时为您工作。我已经在回答中提到了这一点。 :-) -
@abarnert NameError 问题现已解决。基本上,类似于 :: for x in process_1 和 y in process_2: do_something(with x & y)。现在如果进程(生成器)增加,迭代器也会增加并且 do_something(with x,y,...n)