python3中map和list迭代器之间的区别

时间:2015-09-15 10:08:53

标签: python-3.x iterator

在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的初始状态。所以也可能是这种行为与地图的一种懒惰(?)评估有关?

1 个答案:

答案 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调用会再次产生一个空的列表对象。