如何用reduce对字典列表的Kids值求和?现有代码返回结果异常求指导
问题分析与解决
你的代码存在两个关键问题:
- map逻辑不符合需求:你想用map把Kids>2的项改为1,但当前
x["Kids"]-2的写法只是做减法(比如3-2=1,但若Kids是4会得到2),无法实现“改为1”的目标。 - reduce的参数错误:map输出的是数值列表(不是字典),所以
y["Kids"]会试图从数值中取键,逻辑错误。另外,当reduce处理单个元素时会直接返回该元素,这也是你得到结果1的原因。
根据你的需求,分两种场景给出解决方案:
场景1:对所有父母的Kids值处理后求和
如果需求是所有父母中,Kids>2的改为1,其余保留原值,再求总和,代码如下:
from functools import reduce parents = [ {'Name': 'Peter', 'Kids': 2}, {'Name': 'Mary', 'Kids': 1}, {'Name': 'Lia', 'Kids': 3} ] total = reduce(lambda x, y: x + y, map(lambda p: 1 if p["Kids"] > 2 else p["Kids"], parents)) print(total) # 输出:4(2+1+1)
场景2:仅统计Kids>2的父母数量(将这类项的Kids改为1后求和)
如果需求是只筛选出Kids>2的父母,把他们的Kids改为1后求和(本质是统计符合条件的父母数量),代码可以简化为:
from functools import reduce parents = [ {'Name': 'Peter', 'Kids': 2}, {'Name': 'Mary', 'Kids': 1}, {'Name': 'Lia', 'Kids': 3} ] # 写法1:map+reduce total = reduce(lambda x, y: x + y, map(lambda p: 1, filter(lambda p: p["Kids"] > 2, parents))) # 写法2:带初始值的reduce(更安全,空列表时不会报错) total = reduce(lambda x, _: x + 1, filter(lambda p: p["Kids"] > 2, parents), 0) print(total) # 输出:1
补充说明
- 使用reduce时建议加上初始值(比如场景2的写法2),避免当filter结果为空时抛出异常。
- 其实Python中求和更推荐直接用
sum()函数,比reduce更简洁:- 对应场景1:
total = sum(1 if p["Kids"]>2 else p["Kids"] for p in parents) - 对应场景2:
total = sum(1 for p in parents if p["Kids"]>2)
- 对应场景1:
内容的提问来源于stack exchange,提问作者rkive
相关产品推荐
相关产品推荐

