Python 列表内不同字典相同key对应数值累加的Pythonic实现咨询
Pythonic实现方案
方案1:使用collections.defaultdict(标准库实现,性能最优,推荐优先使用)
时间复杂度为O(n),无需提前排序,Python3.7+版本可自动保留原列表中Name首次出现的顺序:
from collections import defaultdict sum_dict = defaultdict(int) for item in my_list: sum_dict[item["Name"]] += item["Amount"] # 转换为目标格式的字典列表 my_list_2 = [{"Name": name, "Amount": amount} for name, amount in sum_dict.items()]
方案2:使用itertools.groupby(函数式风格写法)
groupby仅能将连续的同键元素分为一组,所以需要先按Name排序,时间复杂度为O(nlogn),适合小数据量场景:
from itertools import groupby my_list_2 = [ {"Name": name, "Amount": sum(item["Amount"] for item in group)} for name, group in groupby(sorted(my_list, key=lambda x: x["Name"]), key=lambda x: x["Name"]) ]
方案3:基于pandas实现(项目已引入pandas时最简洁)
import pandas as pd # 加sort=False可保留原列表Name首次出现的顺序,默认按Name字典序排序 my_list_2 = pd.DataFrame(my_list).groupby("Name", as_index=False, sort=False)["Amount"].sum().to_dict("records")
注:如果对输出结果的顺序有要求,优先选择方案1或者方案3调整sort参数实现。
内容的提问来源于stack exchange,提问作者Ignas
相关产品推荐
相关产品推荐

