Python:同时操作的循环,两个或更多?

时间:2013-05-14 20:45:30

标签: python for-loop

这个问题与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工作得很好。

3 个答案:

答案 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]后,可以是TrueFalse。您在之前的循环实验中将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])

这会同时访问两个列表的相同索引。