Python:将地图对象转换为列表使地图对象为空?

时间:2017-07-10 17:08:38

标签: python-3.x casting

我有一个地图对象,我想将其作为列表打印,但之后继续用作地图对象。实际上我想打印长度,所以我转换为列表,但如果我只打印内容如下,问题也会发生:

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 []

为什么会发生这种情况?如何避免它继续使用地图及其内容?

3 个答案:

答案 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)

由于我使用的是Python 3.7版本,因此遇到了同样的问题。使用list(map(...))可行。对于使用map(...)的较低版本的python,它可以正常工作,但对于较高版本,map返回指向内存位置的迭代器。因此print(...)语句将给出地址而不是项目本身。要获取商品,请尝试使用list(map(...))

enter image description here