python3中map和list迭代器的区别

2024-03-29 06:39:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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)))

按照python3.4.2中的原样运行MWE将产生s1的预期输出:

^{pr2}$

但s的空列表[]。取消对标记行的注释将生成正确的输出,如上所述,但也会得到s的预期输出:

s=[[2,3],[5,6]].

医生说map需要一个iterable。直到今天,我还没有看到map和list迭代器之间的区别。有人能解释一下这种行为吗?在

奇怪的是,如果我取消了第一个print语句的注释,s的初始状态就被打印出来了。所以也可能是这种行为和懒惰有关地图评估?在


Tags: oflambda元素map列表地图bewill
1条回答
网友
1楼 · 发布于 2024-03-29 06:39:24

map()是一个迭代器;您只能在它上面迭代一次。例如,可以使用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。您只能执行一次,因此一旦元素用完,任何进一步的迭代都将失败:

^{pr2}$

list()也做了同样的事情;它接受一个iterable参数,并将迭代该对象以根据结果创建一个新的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)
[]

注意,对map()对象的第二次list()调用再次导致一个空列表对象。在

相关问题 更多 >