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:将地图对象转换为列表会使地图对象为空?的主要内容,如果未能解决你的问题,请参考以下文章

Terraform - 如何将列表转换为地图(如何使用 terraform 获取 AMI 标签)

Python:在地图对象上调用“列表”两次

将“地图”对象转换为“SpatialPolygon”对象

java 对象和地图互转及去掉图中为空的元素

Python:在地图对象上调用'list'两次

将对象列表转换为映射Java 8流