在python3中使用map和list迭代器时遇到了意外的行为。在这个MWE中,我首先生成一张地图图。然后,我想在一个列表中的每个地图的第一个元素,以及原始地图中的其余部分:
# s will be be a map of maps
s=[[1,2,3],[4,5,6]]
s=map(lambda l: map(lambda t:t,l),s)
# uncomment to obtain desired output
# s = list(s) # s is now a list of maps
s1 = map(next,s)
print(list(s1))
print(list(map(list,s)))
在python 3.4.2中运行MWE会产生s1的预期输出:
s1 = ([1,4]),
但s的空列表[]。取消注释标记的行会产生正确的输出,如上所述s1,但也会产生s的预期输出:
s=[[2,3],[5,6]].
文档说地图需要一个可迭代的。直到今天,我看到map和list迭代器之间没有区别。有人可以解释这种行为吗?
PS:奇怪的是,如果我取消注释第一个print语句,则打印s的初始状态。所以也可能是这种行为与地图的一种懒惰(?)评估有关?
答案 0 :(得分:1)
next()
是一个迭代器;你只能迭代一次。例如,您可以使用>>> s = [[1, 2, 3], [4, 5, 6]]
>>> map_of_maps = map(lambda l: map(lambda t: t, l), s)
>>> first_elements = map(next, map_of_maps)
获取单个元素,但是一旦用完了项目,就无法获得更多值。
我给你的对象一些更容易记住的名字:
first_elements
此处迭代map_of_maps
将依次迭代>>> next(first_elements)
1
>>> next(first_elements)
4
>>> next(first_elements)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
。你只能一次,所以一旦我们用完元素,任何进一步的迭代都会失败:
list()
map()
完全相同;它需要一个可迭代的参数,并将迭代该对象以从结果中创建一个新的列表对象。但是如果你给它一个已经用尽的>>> list(first_elements)
[]
,就没有什么可以复制到新列表中了。因此,您得到一个空结果:
map()
您需要从头开始重新创建>>> map_of_maps = map(lambda l: map(lambda t: t, l), s)
>>> first_elements = map(next, map_of_maps)
>>> list(first_elements)
[1, 4]
>>> list(first_elements)
[]
:
list()
请注意,map()
对象上的第二次 ng-Checked
调用会再次产生一个空的列表对象。