我想知道是否可以使用map来对列表中的元素求和。
假设He He
a = [1, 2, 3, 4]
会出现list(map(sum, a))
错误,因为列表需要迭代。
int object is not iterable
是一个有效的陈述但是给定了对象,我没有看到一种简单的方法来取消引用它。
map(sum, a)
将返回列表中的对象
this回答说应该很容易。我在这里缺少什么?
答案 0 :(得分:7)
x = list(map(sum,a))
相当于
x = []
for i in a:
x.append(sum(i))
Sum需要一个iterable来应用sum。如果您看到文档语法以这种方式sum(iterable[, start])
。由于int
不是可迭代的,因此您会收到该错误。
答案 1 :(得分:3)
map
将函数应用于列表中的每个元素。相反,您可以使用reduce
:
a = [1, 2, 3, 4]
sum_a = reduce(lambda x, y:x+y, a)
在这种情况下,可以使用纯sum
,但为了更加实用,reduce
是更好的选择。
或者,在Python3中:
from functools import reduce
a = [1, 2, 3, 4]
sum_a = reduce(lambda x, y:x+y, a)
答案 2 :(得分:2)
当然,如果只想对列表中的元素求和,他应该简单地调用sum(list_)
。
现在,提出你的问题:map
,Python内置和模式都是指将函数应用于数据序列,并生成另一个序列,并为初始化中的每个元素提供单独的结果序列
sum
不这样做 - 它会为整个序列产生一个结果。该模式称为reduce
,因此Python内置了这样做。在Python 3中,它被降级了#34;到functools
模块,因为它比地图模式更少使用。
sum
内置本身使用" reduce"单独使用模式 - 但如果您使用reduce模式显式重新创建sum
,它就像:
from functools import reduce
a = [1, 2, 3, 4]
reduce(lambda result, value: result + value, a, 0)
第一个参数是一个可调用的,它采用"累计结果到目前为止",第二个值是你想要运行的项目序列减少,第三个参数是要传递的初始值作为累积结果。 (所以,它从零开始)。对于乘法,我们可以使用:
reduce(lambda result, value: result * value, a, 1)
答案 3 :(得分:0)
错误int object is not iterable
不是因为list
期望可迭代,而sum
期望迭代。
以下代码:
map(sum , [1,2,3,4])
有点等同于:
[sum(x) for x in [1,2,3,4]]
执行最后一个表达式会产生相同的错误。
答案 4 :(得分:0)
下面是做纯粹功能的一种方式。
from operator import add
from functools import reduce
result = reduce(add, a)