Python字典列表按指定键去重并对指定值键求和方案问询
解决方案
以下是实现需求的Python函数,支持按指定键分组、值求和,并自动合并不同字段值为列表:
def merge_and_sum(arr, name_key, value_key): groups = {} no_key_items = [] for item in arr: if name_key not in item: no_key_items.append(item) continue key_val = item[name_key] if key_val not in groups: groups[key_val] = item.copy() groups[key_val][value_key] = item[value_key] else: groups[key_val][value_key] += item[value_key] # 合并非分组键、非求和键的字段 for k, v in item.items(): if k in (name_key, value_key): continue existing = groups[key_val][k] if isinstance(existing, list): if v not in existing: existing.append(v) else: if existing != v: groups[key_val][k] = [existing, v] return list(groups.values()) + no_key_items
场景测试
测试数据
arrayList = [ {"value": 10,"name": "BBB","extra": "sample"}, {"value": 10,"name": "BBB"}, {"value": 10,"name": "AAA","extra": "sample"}, {"value": 10,"name": "AAA"} ]
场景1:按name分组,对value求和
result = merge_and_sum(arrayList, "name", "value") print(result)
输出:
[{'value': 20, 'name': 'BBB', 'extra': 'sample'}, {'value': 20, 'name': 'AAA', 'extra': 'sample'}]
场景2:按extra分组,对value求和
result = merge_and_sum(arrayList, "extra", "value") print(result)
输出:
[{'value': 20, 'name': ['BBB', 'AAA'], 'extra': 'sample'}, {'value': 10, 'name': 'BBB'}, {'value': 10, 'name': 'AAA'}]
核心逻辑说明
- 用
groups字典按指定的name_key分组存储合并结果 - 单独收集不包含
name_key的原始项,直接加入最终结果 - 对
value_key对应的值进行累加求和 - 合并其他字段时,若同一分组内字段值不同,自动转为列表存储;值相同时保留原类型
内容的提问来源于stack exchange,提问作者J.FOG
相关产品推荐
相关产品推荐

