如何用最Pythonic的方法对字典列表中匹配键的值求和?
对字典列表中匹配键的值求和的Pythonic实现方法
嘿,你的问题问得很到位!要实现字典列表里各对应键的值累加,确实有比嵌套循环更贴合Python风格的写法,我给你分享几种实用方案:
方案一:用collections.Counter(最推荐)
Counter本身就是标准库为计数/累加场景量身打造的工具,比defaultdict更适配这个需求,代码简洁还语义明确:
from collections import Counter from itertools import chain # 写法1:循环更新Counter,可读性拉满 demandresult = Counter() for d in demandlist: demandresult.update(d) # 写法2:更紧凑的一行式(利用迭代器展开所有键值对) demandresult = Counter(chain.from_iterable(d.items() for d in demandlist))
chain.from_iterable会把所有字典的键值对扁平化成一个连续的迭代器,Counter会自动帮我们完成每个键的数值累加,非常省心。
方案二:纯推导式实现
如果你偏好完全用推导式的写法,也可以先收集所有唯一键,再对每个键遍历所有字典求和:
# 先获取所有字典里的唯一键集合 all_keys = {key for dic in demandlist for key in dic} # 字典推导式完成累加,用get避免KeyError demandresult = {key: sum(dic.get(key, 0) for dic in demandlist) for key in all_keys}
这里用dic.get(key, 0)是为了处理某些字典没有对应键的情况,如果能确定所有字典都包含相同的键,也可以直接用dic[key]。
对比你原有的代码
你用defaultdict的写法其实已经很清晰易懂了,只是Counter在这个场景下更贴合Python"用合适的工具做合适的事"的理念,代码更简洁。如果你的业务场景里需要频繁做这类累加操作,Counter会是更好的选择。
内容的提问来源于stack exchange,提问作者Mark Ginsburg
相关产品推荐
相关产品推荐

