使用map函数

6

我在使用map函数时遇到了问题。当我想打印创建的列表时,解释器会显示指针:

>>> squares = map(lambda x: x**2, range(10))
>>> print(squares)
<map object at 0x0000000002A086A0>

什么是问题?
4个回答

7
问题是列表没有被创建。在Python 3中,map返回一种特定类型的迭代器,而不是列表(可以看到是“映射对象”)。您可以尝试:
print(list(squares))

或者只需使用列表推导式直接获取列表(在这种情况下似乎更好):

squares = [x**2 for x in range(10)]

在Python 2.x中,map返回一个列表。Python 3中的变化在文档的这个部分中有所描述:
  • map()filter()现在返回迭代器。如果您确实需要一个列表,一个快速的解决方法是使用list(map(...)),但更好的解决方法通常是使用列表推导式(特别是当原始代码使用lambda时),或者重写代码以完全不需要列表。特别棘手的是为了函数的副作用而调用map();正确的转换是使用普通的for循环(因为创建一个列表只会是浪费)。

2

map返回一个迭代器,也就是说,一旦需要,它可以用来循环遍历。要获取实际的列表,请执行print(list(squares))。或者

for a in squares:    
    print(a)

一开始看起来可能有些奇怪,但请想象一下你有100万个数字。如果它立即创建一个列表,你需要为100万个元素分配内存,即使你可能只想一次查看一个元素。使用迭代器,只有在必要时才会将所有元素的完整列表保存在内存中。


1

map() 在 Python 2 和 3 中有所不同。在 Python 2 中,map 会将一个函数应用于可迭代对象的值并返回一个列表。而在 Python 3 中,map 返回一个迭代器,在循环中遍历时对迭代的值应用该函数。

Python 2:

>>> print map(lambda x: x**2, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

python3 - map返回一个迭代器对象:

>>> print(map(lambda x: x**2, range(10)))
<map object at 0x7fb4b7c82250>

这可以被任何消费迭代器的东西使用,比如list

>>> print(list(map(lambda x: x**2, range(10))))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

-1

你可以使用解包操作,像这样:

>>> [*map(lambda x: x**2, range(10))]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

这段代码 list(map(lambda x: x**2, range(10))) 可能比较难读懂,但实际上应该使用列表推导式来代替:[x**2 for x in range(10)] - wjandrea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接