这个问题与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。如果n3 = [3,4,5,6,7,8,78,34]大于n1,n2,该怎么办? zip不会在这里工作。像izip_longest这样的东西? izip_longest工作得很好。
答案 0 :(得分:6)
很难理解你在问什么,但我认为你只想要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
等等......
这并不是并发,因为这个术语通常被使用,它一次只做一件事,但是有一点是“在锁定步骤中迭代两个序列”。 / p>
请注意,这显然会扩展到三个或更多列表:
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
答案 1 :(得分:3)
您想使用zip()
function:
for i, j in zip([1, 2, 3], [3, 2, 1]):
#
for i, j in zip(f_iterate1(), f_iterate2()):
#
zip()
将输入列表的元素配对,让您一起处理它们。
如果您的输入很大或是迭代器,请使用future_builtins.zip()
,或者,如果您不关心与Python 3的向前兼容性,请改用itertools.izip()
;这些按需产生对而不是一次创建整个输出列表:
from future_builtins import zip
for i, j in zip(f_iterate1(), f_iterate2()):
您的发电机属于这种情况。
最后但并非最不重要的是,如果您的输入列表具有不同的长度,则zip()
会在最短列表耗尽时停止。如果您想继续使用最长列表,请使用itertools.izip_longest()
;当较短的输入序列耗尽时,它将使用填充值:
>>> for i, j, k in izip_longest(range(3), range(3, 5), range(5, 10), fillvalue=42):
... print i, j, k
...
0 3 5
1 4 6
2 42 7
42 42 8
42 42 9
fillvalue
的默认值为None
。
您的尝试:
for i in [1,2,3], j in [3,2,1]:
实际上被解释为:
for i in ([1,2,3], j in [3,2,1]):
其中后一部分被解释为具有两个值的元组,一个是列表,另一个是布尔值;在测试j in [3,2,1]
后,可以是True
或False
。您在之前的循环实验中将j
定义为0
,因此0 in [3, 2, 1]
为False
。
答案 2 :(得分:0)
对于相同长度的数组,您可以使用索引来引用相应列表中的相应位置,如下所示:
a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
for i in range(len(a)):
print(a[i])
print(b[i])
这会同时访问两个列表的相同索引。