我在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的初始状态就被打印出来了。所以也可能是这种行为和懒惰有关地图评估?在
map()
是一个迭代器;您只能在它上面迭代一次。例如,可以使用next()
获得单个元素,但是一旦用完了项,就无法获得更多的值。在我给你的物品取了几个更容易记住的名字:
在此处迭代
^{pr2}$first_elements
将依次迭代map_of_maps
。您只能执行一次,因此一旦元素用完,任何进一步的迭代都将失败:list()
也做了同样的事情;它接受一个iterable参数,并将迭代该对象以根据结果创建一个新的list对象。但是如果你给它一个map()
这个值已经用完了,那么就没有什么可以复制到新列表中了。因此,您将得到一个空结果:您需要从头开始重新创建
map()
:注意,对
map()
对象的第二次list()
调用再次导致一个空列表对象。在相关问题 更多 >
编程相关推荐