这个问题与如何同时运行两个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工作得很好.
很难理解你在问什么,但我想你只是想要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)
您想使用该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],是True或False。您在之前的循环实验中j定义了 as 0,因此0 in [3, 2, 1]是False。
| 归档时间: |
|
| 查看次数: |
11089 次 |
| 最近记录: |