Python:将地图对象转换为列表会使地图对象为空?
Posted
技术标签:
【中文标题】Python:将地图对象转换为列表会使地图对象为空?【英文标题】:Python: casting map object to list makes map object empty? 【发布时间】:2021-03-18 11:10:48 【问题描述】:我有一个地图对象,我想将其打印为列表,但之后继续用作地图对象。实际上我想打印长度,所以我将其转换为列表,但如果我只是按如下方式打印内容,也会出现问题:
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.5.2 【参考方案1】:因为我使用的是 Python 3.7 版本,所以我遇到了同样的问题。使用list(map(...))
有效。对于使用map(...)
的较低python 版本可以正常工作,但对于较高版本,map 返回一个指向内存位置的迭代器。所以print(...)
语句将给出地址而不是项目本身。要获取项目,请尝试使用list(map(...))
【讨论】:
【参考方案2】:原因是 Python 3 map
返回一个 iterator 并列出迭代器的元素“消耗”它,没有办法“重置”它
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']
【讨论】:
【参考方案3】:map
对象是调用 map()
内置函数返回的生成器。它仅被迭代一次(例如,通过将其传递给list()
),然后被使用。尝试再次对其进行迭代将导致一个空序列。
如果您想保存映射值以供重复使用,您需要将map
对象转换为另一种序列类型,例如list
,然后保存结果。所以改变你的:
my_map = map(...)
到
my_map = list(map(...))
之后,您上面的代码应该可以按预期工作。
【讨论】:
以上是关于Python:将地图对象转换为列表会使地图对象为空?的主要内容,如果未能解决你的问题,请参考以下文章