You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

列表中字典对象基于多字段去重并合并算术字段的需求

合并字典列表:基于多字段去重并指定字段求和

假设你有一个字典组成的列表,需要根据两个或多个字段判断是否重复,重复的字典要合并:对指定字段做算术运算(比如求和),其他字段如果有不同值,保留首次出现的内容。咱们用你给出的示例来具体说明:

输入示例

[ 
  { "CUSTOMER": "XYZ", "COUNTRY CODE": "US", "ID": "Essential", "USAGE": 500 }, 
  { "CUSTOMER": "XYZ", "COUNTRY CODE": "US", "ID": "Seats", "USAGE": 20 }, 
  { "CUSTOMER": "XYZ", "COUNTRY CODE": "FR", "ID": "Essential", "USAGE": 50 } 
]

输出示例

[ 
  { "CUSTOMER": "XYZ", "COUNTRY CODE": "US", "ID": "Essential", "USAGE": 550 }, 
  { "CUSTOMER": "XYZ", "COUNTRY CODE": "US", "ID": "Seats", "USAGE": 20 } 
]

解决思路

核心是用一个临时字典来跟踪已经处理过的唯一字段组合,步骤如下:

  • 定义重复判定字段(比如CUSTOMER和ID)、需要运算的字段(比如USAGE)
  • 遍历输入列表中的每个字典,用判定字段组成的元组作为临时字典的键(元组可哈希,能唯一标识重复项)
  • 如果键不存在,就把当前字典的副本加入临时字典;如果键已存在,就对指定字段执行累加,其他字段保持首次出现的值

Python代码实现

def merge_duplicate_dicts(input_list, duplicate_keys, sum_key):
    merged = {}
    for item in input_list:
        # 生成唯一键:由判定重复的字段值组成元组
        key = tuple(item[k] for k in duplicate_keys)
        if key not in merged:
            # 首次出现,复制字典到merged中
            merged[key] = item.copy()
        else:
            # 重复项,对指定字段求和
            merged[key][sum_key] += item[sum_key]
            # 其他字段保留首次出现的值,无需额外处理
    # 把merged的值转换成列表返回
    return list(merged.values())

# 测试示例
input_data = [ 
  { "CUSTOMER": "XYZ", "COUNTRY CODE": "US", "ID": "Essential", "USAGE": 500 }, 
  { "CUSTOMER": "XYZ", "COUNTRY CODE": "US", "ID": "Seats", "USAGE": 20 }, 
  { "CUSTOMER": "XYZ", "COUNTRY CODE": "FR", "ID": "Essential", "USAGE": 50 } 
]

# 指定判定重复的字段、需要求和的字段
result = merge_duplicate_dicts(input_data, ["CUSTOMER", "ID"], "USAGE")
print(result)

代码说明

  1. 唯一键生成:用duplicate_keys指定的字段值组成元组,确保只有当这些字段都相同时才判定为重复
  2. 字典复制:用item.copy()避免后续修改影响原字典,同时完整保留首次出现的所有字段值
  3. 字段运算:只对sum_key指定的字段执行累加,其他字段自动保留首次出现的内容,完全贴合需求

内容的提问来源于stack exchange,提问作者Amit Bharti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:41:56