5

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

我会以更清楚的方式表达:我得到了提问者在上面的链接中提出的问题,例如

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 足够好。

4

3 回答 3

10

很难理解你在问什么,但我认为你只是想要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. 那是因为您只是创建了一个包含两个值的元组,第一个是 list [1,2,3],第二个是 expression 的结果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
于 2013-05-14T20:49:21.933 回答
5

您想使用该zip()功能

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

于 2013-05-14T20:49:18.957 回答
1

对于相同长度的数组,您可以使用索引来引用各个列表中的相应位置,如下所示:

a = [1, 2, 3, 4, 5]
b = [2, 4, 6, 8, 10]
for i in range(len(a)):
    print(a[i])
    print(b[i])

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

于 2018-05-21T07:58:06.073 回答