我有一个地图对象,我想将其作为列表打印,但之后继续用作地图对象。实际上我想打印长度,所以我转换为列表,但如果我只打印内容如下,问题也会发生:
print("1",my_map)
print("1",list(my_map))
print("2",my_map)
print("2",list(my_map))
这给了我以下输出。
1 <map object at 0x7fd2962a75f8>
1 [(1000.0, 1.0, 0.01, 0.01, 0.01, 0.01, 0.01)]
2 <map object at 0x7fd2962a75f8>
2 []
为什么会发生这种情况?如何避免它继续使用地图及其内容?
答案 0 :(得分:5)
map
对象是从调用map()
内置函数返回的生成器。它旨在迭代(例如,通过将其传递给list()
)一次,然后消耗它。尝试再次迭代它将导致空序列。
如果要保存映射值以便重用,则需要将map
对象转换为另一种序列类型,例如list
,并且保存结果。所以改变你的:
my_map = map(...)
到
my_map = list(map(...))
之后,上面的代码应该按预期工作。
答案 1 :(得分:3)
原因是Python 3 map
返回迭代器并列出迭代器的元素&#34;消耗&#34;它没有办法重置&#34;它
my_map = map(str,range(5))
list(my_map)
# Out: ['0', '1', '2', '3', '4']
list(my_map)
# Out: []
如果要保留地图对象,可以使用itertools.tee
创建稍后要使用的迭代器的副本
from itertools import tee
my_map, my_map_iter = tee(map(str,range(5)))
list(my_map)
# Out: ['0', '1', '2', '3', '4']
list(my_map)
# Out: []
list(my_map_iter)
# Out: ['0', '1', '2', '3', '4']
答案 2 :(得分:1)