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

时间:2019-05-12 03:18:40

标签: python python-3.x

尽管文档告诉我,我应该能够使用list(map_object)将地图对象转换为列表,但这并不符合我想要的方式。

我有一个简单的程序:

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]
[]

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

正如评论中已经提到的,map为您提供了一个迭代器,您只能consume或迭代一次,之后迭代器为空,这就是您{{ 1}}

相反,将print(list(arr))分配给变量,例如list(arr),然后可以在后续代码中使用它

list_arr = list(arr)

答案 1 :(得分:0)

评论map是一次性消耗品,因此您可以执行以下操作:

n = int(input())
arr = map(int, input().split())
list_arr = list(arr)
print(list_arr) #this works

您可以多次使用list_arr值。

答案 2 :(得分:-1)

一旦您愿意

  • 了解/了解Python生成器如何工作;

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

您将轻松找出此问题(看起来很奇怪,但非常有用和简单)。

  

感谢 yield 关键字和 StopIteration 异常以及一些魔术方法,因为这些方法在编写我们自己的生成器中发挥了重要作用。

Python 3.6.7 (v3.6.7:6ec5cf24b7, Oct 20 2018, 03:02:14) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> arr = [1729, 67, 92]
>>> gen = map(str, arr)
>>> 
>>> # 1st item
... 
>>> gen.__next__()
'1729'
>>> 
>>> # 2nd item
... 
>>> gen.__next__()
'67'
>>> 
>>> # 3rd item
... 
>>> gen.__next__()
'92'
>>> 
>>> # This will not work (Exception beacause no more items are in generator, over)
... 
>>> gen.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> 

因此,如果您专注于以下示例,则会感到困惑(第一次)。

>>> 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
[]
>>> 

仅供参考,请查看以下链接:

答案 3 :(得分:-2)

简而言之,您不能喜欢: delete(employee: Employee): Observable<Employee> { const id = typeof employee === 'number' ? employee : employee.id; console.log(id); const url = `${this.employeesUrl}/${id}`; console.log(url); return this.http.delete<Employee>(url, httpOptions) .pipe(tap(_ => console.log(`deleted employee id=${id}`)), catchError(this.handleError<Employee>('deleteEmployee')) ); } 。因为如以上答案所述,它已经消耗了。

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