Python:使用map函数

时间:2013-08-06 18:16:31

标签: python map

我遇到map功能问题。当我想打印创建的列表时,解释器显示指针:

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

有什么问题?

4 个答案:

答案 0 :(得分:4)

问题是没有创建列表。 {3}}在Python 3中返回一个特定类型的生成器,它不是一个列表(而是一个'map object',如你所见)。你可以尝试

print(list(squares))

或者只是使用列表推导来获取列表(这似乎在这里似乎更好):

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

map用于返回Python 2.x中的列表,并且在文档的map部分中描述了在Python 3中所做的更改:

  
      
  • map()filter()返回迭代器。 如果您确实需要列表,可以快速修复list(map(...)),但更好的解决方法通常是使用列表解析(特别是当原始代码使用lambda时,或者重写代码以便根本不需要列表。特别棘手的是map()为函数的副作用调用;正确的转换是使用常规for循环(因为创建列表只会浪费)。
  •   

答案 1 :(得分:1)

map会返回一个generator,也就是说,这可以用来在需要时循环。要获取实际列表,请执行print(list(squares))。或者

for a in squares:    
    print a

更新:这看起来很奇怪,但想象你有1个数字。如果它会立即创建一个列表,你需要为1mio元素分配内存,即使你可能只想一次查看一个。使用生成器,只有在必要时才会将完整的元素列表保存在内存中。

答案 2 :(得分:1)

map()在python 2和3之间发生了变化。在python 2中,map会将函数应用于iterable并返回一个列表。在python 3中,map返回一个生成器,当你循环它时,它将函数应用于迭代器。

python2:

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

python3:

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

答案 3 :(得分:0)

您可以像这样使用拆包:

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