什么时候map()需要?

时间:2014-06-03 17:30:20

标签: python-3.x map

鉴于以下内容:

(I)a =地图(功能,序列)

(II)a = [顺序x的函数(x)]

我什么时候需要使用(I)?为什么在后者可订阅且IMO更具可读性时选择列表上的地图对象?

此外,有人可以解释以下代码的第6行(Python 3):

>>>import math
>>>a = map(int,str(math.factorial(100)))
>>>sum(a)
648
>>>sum(a)
0

为什么地图对象的总和在变化?

3 个答案:

答案 0 :(得分:2)

我是迭代器 - 它会创建一个值流然后消失。 II是列表 - 它会持续一段时间,并且具有很多功能,例如len(mylist)mylist[-3:]

sum发生了变化,因为迭代器在使用后会消失。

使用列表和列表推导。如果处理大量数据,那么迭代器(以及生成器和生成器理解)非常棒,但它们可能会令人困惑。

或者,使用迭代器并转换为列表以进行进一步处理:

a = list( map(int,str(math.factorial(100))) )

答案 1 :(得分:1)

来自the docs

  

将函数应用于iterable的每个项目并返回结果列表。如果传递了额外的可迭代参数,则函数必须采用那么多参数,并且并行地应用于所有迭代的项...

sum更改为0,因为迭代器是迭代,因此它变为空。这与.read()的概念相同(尝试调用x = open('myfile.txt'),然后两次输入print x.read()。)


为了保留可迭代,请使用list()

将其包围
>>> import math
>>> a = map(int,str(math.factorial(100)))
>>> sum(a)
648
>>> sum(a)
0
>>> a = list(map(int,str(math.factorial(100))))
>>> sum(a)
648
>>> sum(a)
648

来自the docs的示例:

>>> seq = range(8)
>>> def add(x, y): return x+y
...
>>> map(add, seq, seq)
[0, 2, 4, 6, 8, 10, 12, 14]

答案 2 :(得分:1)

  

我什么时候需要使用(I)?为什么在后者可订阅且IMO更具可读性时选择列表上的地图对象?

map是在Python 1.0中引入的,而列表理解直到Python 2.0才引入。

对于Python 2+,您从不需要使用其中一个。

仍然使用map的原因可能包括:

  • 偏好。你更喜欢列表理解,并不是每个人都同意。
  • 的熟悉程度。 map在各种语言中非常常见。如果Python不是您的母语,那么#34; map"是你要查找的功能。
  • 简洁。 map通常较短。比较maplambda f,l: [f(x) for x in l]