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

Ati*_*rag 4 casting python-3.x

我有一个要打印为列表的地图对象,但此后继续用作地图对象。实际上,我想打印长度,以便将其强制转换为列表,但是如果仅按如下所示打印内容,也会出现此问题:

print("1",my_map)
print("1",list(my_map))
print("2",my_map)
print("2",list(my_map))
Run Code Online (Sandbox Code Playgroud)

这给了我以下输出。

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 []
Run Code Online (Sandbox Code Playgroud)

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

use*_*737 8

原因是 Python 3map返回一个迭代器并列出迭代器的元素“消耗”它并且无法“重置”它

my_map = map(str,range(5))

list(my_map)
# Out: ['0', '1', '2', '3', '4']

list(my_map)
# Out: []
Run Code Online (Sandbox Code Playgroud)

如果您想保留地图对象,您可以使用它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']
Run Code Online (Sandbox Code Playgroud)


gli*_*dud 6

一个map对象是从调用返回的发生器map()内置功能。它仅打算迭代一次(例如,将其传递给list()),然后再使用。尝试对其进行第二次迭代将导致序列为空。

如果要保存映射值以重复使用,则需要将map对象转换为另一种序列类型,例如a list,然后保存result。因此,更改您的:

my_map = map(...)
Run Code Online (Sandbox Code Playgroud)

my_map = list(map(...))
Run Code Online (Sandbox Code Playgroud)

之后,上面的代码应该可以按预期工作。