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)
为什么会发生这种情况,如何避免继续使用地图及其内容?
原因是 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)
一个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)
之后,上面的代码应该可以按预期工作。
| 归档时间: |
|
| 查看次数: |
2699 次 |
| 最近记录: |