如何合并字典列表中同doc与account_name的amount值?
合并字典列表中相同doc和account_name的amount字段
给定如下格式的字典列表:
[ { "account_name": "Rounded Off (Purchase)", "amount": 0.28, "doc_date": "2023-04-05", "doc": "P.Inv.-1", "date_created": "2023-04-05T15:30:42.964203" }, { "account_name": "Discount (Purchase)", "amount": 100, "doc_date": "2023-04-05", "doc": "P.Inv.-1", "date_created": "2023-04-05T15:30:42.964203" }, { "account_name": "Discount (Purchase)", "amount": 86.4, "doc_date": "2023-04-05", "doc": "P.Inv.-1", "date_created": "2023-04-05T15:30:42.964203" } ]
需要将具有相同doc和account_name值的字典的amount字段求和合并,简化后的期望结果如下:
[ { "account_name": "Rounded Off (Purchase)", "amount": 0.28, "doc_date": "2023-04-05", "doc": "P.Inv.-1", "date_created": "2023-04-05T15:30:42.964203" }, { "account_name": "Discount (Purchase)", "amount": 186.4, "doc_date": "2023-04-05", "doc": "P.Inv.-1", "date_created": "2023-04-05T15:30:42.964203" } ]
简洁实现方案
可以用一个临时字典分组,以(doc, account_name)作为唯一键,遍历列表时累加对应amount,最后将字典值转为列表即可,无需多层循环和大量占位变量:
original_list = [ {"account_name": "Rounded Off (Purchase)", "amount": 0.28, "doc_date": "2023-04-05", "doc": "P.Inv.-1", "date_created": "2023-04-05T15:30:42.964203"}, {"account_name": "Discount (Purchase)", "amount": 100, "doc_date": "2023-04-05", "doc": "P.Inv.-1", "date_created": "2023-04-05T15:30:42.964203"}, {"account_name": "Discount (Purchase)", "amount": 86.4, "doc_date": "2023-04-05", "doc": "P.Inv.-1", "date_created": "2023-04-05T15:30:42.964203"} ] merged_dict = {} for item in original_list: key = (item["doc"], item["account_name"]) if key in merged_dict: merged_dict[key]["amount"] += item["amount"] else: # 复制item避免修改原数据 merged_dict[key] = item.copy() merged_list = list(merged_dict.values()) print(merged_list)
代码说明
- 用元组
(doc, account_name)作为分组键,因为元组是可哈希类型,能作为字典的键 - 遍历原始列表时,若键已存在则累加
amount,不存在则复制当前字典到分组中 - 最后将字典的所有值转为列表,得到合并后的结果
如果需要处理浮点数精度问题(比如累加后出现多位小数),可以用round()函数对amount进行处理,例如:
merged_dict[key]["amount"] = round(merged_dict[key]["amount"] + item["amount"], 2)
内容的提问来源于stack exchange,提问作者Sourabh Patel
相关产品推荐
相关产品推荐

