Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对列表应用reduce函数_Python_Python 2.7 - Fatal编程技术网

Python 对列表应用reduce函数

Python 对列表应用reduce函数,python,python-2.7,Python,Python 2.7,我想让这段代码计算所有“年龄”字段的总和(我想使用reduce) 这个问题涉及“年龄”是整数的事实 我有错误 TypeError:“int”对象没有属性“getitem” 我使用的是python2.7,如果您没有提供初始值,那么acc将作为列表的第一个元素开始。那真的很难处理。只要从0开始,就可以处理int >>> reduce(lambda acc, curr: acc + curr['age'], mylist, 0) 105 这个问题涉及“年龄”是整数的事实 没有;问题

我想让这段代码计算所有“年龄”字段的总和(我想使用reduce) 这个问题涉及“年龄”是整数的事实

我有错误

TypeError:“int”对象没有属性“getitem


我使用的是python2.7,如果您没有提供初始值,那么
acc
将作为列表的第一个元素开始。那真的很难处理。只要从0开始,就可以处理int

>>> reduce(lambda acc, curr: acc + curr['age'], mylist, 0)
105
这个问题涉及“年龄”是整数的事实

没有;问题是您的
acc
最终将成为一个
int
,它没有
[“年龄”]
可访问

请记住,每次通过
reduce
过程,
acc
将是上一步的结果,即再次执行
int
。因此,您实际上并不想首先访问它的
['age']

但是,您也不希望使用
reduce
来累加一组值,因为这比仅使用正确的工具来完成任务更难理解-
sum

如果我们有

mylist = [{"email": "test1", "age": 35}, {"email": "test2", "age": 32}, {"email": "test3", "age": 38}]
它看起来像:

sum(curr['age'] for curr in mylist)
它还具有在2.x和3.x上工作而不进行更改的优点。(在3.x中,
reduce
不再是一个内置的,必须从
functools
标准库中导入;它像这样被推到一边,专门用来阻止像这样使用它)

但是为了完整性,适当的
reduce
调用如下

reduce(lambda acc, curr: acc+curr['age'], mylist, 0)
同样地,
acc
在过程中的所有步骤都将是
int
。但是请注意,我们还需要在这里显式地提供初始累加器值,因为输入的第一个元素没有所需的类型

黄金法则是,从
lambda acc,curr
返回的任何内容都应该具有与
acc
相同的类型。


有时您还需要使用不同的值或类型。例如,如果要实现乘积而不是求和,则需要从乘法标识开始(即,
1
)。或者,您正在执行一些返回非整数的操作,这将继续返回非整数。(请不要使用此方法连接字符串。
.join
方法更有效。)

我更希望看到:
sum([d['age']表示数据中的d])
。更具可读性。
reduce
功能很少是最好的选择,依我看。我该如何改进这个问题?
reduce(lambda acc, curr: acc+curr['age'], mylist, 0)