Python 对列表应用reduce函数
我想让这段代码计算所有“年龄”字段的总和(我想使用reduce) 这个问题涉及“年龄”是整数的事实 我有错误 TypeError:“int”对象没有属性“getitem”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 这个问题涉及“年龄”是整数的事实 没有;问题
我使用的是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)