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

use*_*820 1 python for-loop

这个问题与如何同时运行两个python循环密切相关

我会更清楚地说明一下:我得到了提问者在上面的链接中提出的问题

for i in [1,2,3], j in [3,2,1]:
    print i,j
    cmp(i,j) #do_something(i,j)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Q2.我如何制作像L1这样的东西?

真的不是多线程或并行.(这是两个并发任务而不是循环内的循环)然后比较两者的结果.

这些列表是数字.我的情况不是数字:

for i in f_iterate1() and j in f_iterate2():
Run Code Online (Sandbox Code Playgroud)

更新:下面的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
Run Code Online (Sandbox Code Playgroud)

而且我不打算压缩两个迭代函数!但是在类似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
>>> 
Run Code Online (Sandbox Code Playgroud)

[解决了]

Q3.如果n3 = [3,4,5,6,7,8,78,34]大于n1,n2,该怎么办?zip不会在这里工作.像izip_longest这样的东西?izip_longest工作得很好.

aba*_*ert 7

很难理解你在问什么,但我想你只是想要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
Run Code Online (Sandbox Code Playgroud)

等等…

这通常不会同时执行任何操作,它一次只执行一项操作,但有一点是"在锁定步骤中迭代两个序列".


请注意,这显然可以扩展到三个或更多列表:

for i, j, k in zip([1,2,3], [3,2,1], [13, 22, 31]):
    print i, j, k
Run Code Online (Sandbox Code Playgroud)

(如果您甚至不知道有多少列表,请参阅注释.)


万一你想知道这是怎么回事:

for i in [1,2,3], j in [3,2,1]:
    print i,j
Run Code Online (Sandbox Code Playgroud)

试试这个:

print [1,2,3], j in [3,2,1]
Run Code Online (Sandbox Code Playgroud)

如果你已经定义了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
Run Code Online (Sandbox Code Playgroud)

......相当于:

j=0
for i in ([1,2,3], False):
    print i, 0
Run Code Online (Sandbox Code Playgroud)

...将打印:

[1, 2, 3] 0
False 0
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

您想使用该zip()功能

for i, j in zip([1, 2, 3], [3, 2, 1]):
    #

for i, j in zip(f_iterate1(), f_iterate2()):
    #
Run Code Online (Sandbox Code Playgroud)

zip() 将输入列表的元素配对,让您可以一起处理它们。

如果您的输入很大或者是迭代器,请使用future_builtins.zip(),或者,如果您不关心与 Python 3 的向前兼容性,请itertools.izip()改用;这些按需生成对,而不是一次性创建整个输出列表:

from future_builtins import zip

for i, j in zip(f_iterate1(), f_iterate2()):
Run Code Online (Sandbox Code Playgroud)

您的生成器属于这种情况。

最后但并非最不重要的一点是,如果您的输入列表具有不同的长度,则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
Run Code Online (Sandbox Code Playgroud)

默认为fillvalueIS None


你的尝试:

for i in [1,2,3], j in [3,2,1]:
Run Code Online (Sandbox Code Playgroud)

真正解释为:

for i in ([1,2,3], j in [3,2,1]):
Run Code Online (Sandbox Code Playgroud)

其中后一部分被解释为具有两个值的元组,一个是列表,另一个是布尔值;经测试j in [3,2,1],是TrueFalse。您在之前的循环实验中j定义了 as 0,因此0 in [3, 2, 1]False