Python 如何将贴图对象转换为列表并分配给变量

Python 如何将贴图对象转换为列表并分配给变量,python,python-3.x,Python,Python 3.x,尽管文档告诉我应该能够使用list(map\u object)将map对象转换为list,但这并不是我想要的方式 我有一个简单的程序: n = int(input()) arr = map(int, input().split()) print(list(arr)) #this works list_arr = list(arr) print(list_arr) #doesn't work 我期望: 3 14 23 1 [14, 23, 1] [14, 23, 1] >>>

尽管文档告诉我应该能够使用
list(map\u object)
将map对象转换为list,但这并不是我想要的方式

我有一个简单的程序:

n = int(input())
arr = map(int, input().split())
print(list(arr)) #this works
list_arr = list(arr)
print(list_arr) #doesn't work
我期望:

3
14 23 1
[14, 23, 1]
[14, 23, 1]
>>>
但我得到:

3
14 23 1
[14, 23, 1]
[]

有什么想法吗?

如评论的
map
是一次性消耗品,因此您可以这样做:

n=int(输入())
arr=map(int,input().split())
列表\u arr=列表(arr)
打印(列表)#这行得通
您可以多次使用
列表\u arr
值。

一旦:

  • 了解Python生成器的工作原理

  • 编写/创建自己的生成器

您将很容易解决这个问题(看起来很奇怪,但非常有用和简单)

由于yield关键字和StopIteration异常&一些神奇的方法在编写我们自己的生成器时发挥了巨大的作用

Python 3.6.7(v3.6.7:6ec5cf24b7,2018年10月20日,03:02:14)
[GCC 4.2.1达尔文兼容苹果LLVM 6.0(clang-600.0.57)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>> 
>>>arr=[1729,67,92]
>>>gen=map(str,arr)
>>> 
>>>#第一项
... 
>>>下一代
'1729'
>>> 
>>>#第2项
... 
>>>下一代
'67'
>>> 
>>>#第3项
... 
>>>下一代
'92'
>>> 
>>>#这将不起作用(异常原因是发电机中没有更多项目,结束)
... 
>>>下一代
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
停止迭代
>>> 
所以,如果你将注意力集中在下面这类例子上,你会感到困惑(第一次)

>arr2=列表(gen)
>>>arr2
['1729', '67', '92']
>>>
>>>#生成器已被迭代,因此没有更多项
...
>>>下一代
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
停止迭代
>>>
>>>arr2=列表(gen)
>>>arr2
[]
>>> 
仅供参考,请查看以下链接:


如评论中所述,为您提供了一个迭代器,您只能
使用它,或者迭代一次,之后迭代器为空,这就是您打印(列表(arr))时发生的情况。

而是将您的
list(arr)
分配给一个变量,如
list\u arr=list(arr)
,然后您可以在后续代码中使用该变量

In [144]: n = int(input())                                                                                                                                                        
3

In [145]: arr = map(int, input().split())                                                                                                                                         
14 23 1
#list_arr can be used for subsequent code, you have consumed arr completely
In [146]: list_arr = list(arr)                                                                                                                                                    

In [147]: print(list_arr)                                                                                                                                                         
[14, 23, 1]
#Iterator is empty after using it once
In [148]: print(list(arr))                                                                                                                                                        
[]

简单地说,您不能这样做:
list\u arr=list(arr)
。因为正如上面的答案所提到的,它已经消耗了


解决此问题的一种方法是,您必须获取每个成员并创建一个新对象。

map
是一次性消耗品。它已在第一次打印中使用,因此其值已用尽。在打印之前,您必须分配一些变量。可能重复感谢Austin&DYZ!是的,效果非常好。您好@arpi我已经尝试总结了我下面回答中评论中出现的任何内容,请看:)相反,这正是我们应该做的:将迭代器转换为列表。
>>> arr2 = list(gen)
>>> arr2
['1729', '67', '92']
>>>
>>> # Generator has already been iterated, so no more items
...
>>> gen.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>>
>>> arr2 = list(gen)
>>> arr2
[]
>>> 
In [144]: n = int(input())                                                                                                                                                        
3

In [145]: arr = map(int, input().split())                                                                                                                                         
14 23 1
#list_arr can be used for subsequent code, you have consumed arr completely
In [146]: list_arr = list(arr)                                                                                                                                                    

In [147]: print(list_arr)                                                                                                                                                         
[14, 23, 1]
#Iterator is empty after using it once
In [148]: print(list(arr))                                                                                                                                                        
[]