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

合并多组字典列表:去重并累加重复项指定字段值后排序

合并字典列表并按ID去重求和的解决方案

我来帮你搞定这个需求,处理这类带重复ID的统计数据合并问题,用临时字典来跟踪累加值是最高效清晰的方式。下面是具体的实现步骤和代码示例:

核心思路

  1. 先把所有需要合并的列表整合为一个大列表,统一处理
  2. 用一个字典以_id为键,存储每个ID对应的累加后的数据
  3. 遍历所有元素,对相同ID的count_enabled和count_disabled字段进行累加
  4. 最后将处理后的字典转换为列表,并按需求排序

Python代码实现

基础版本(无需额外导入模块)

# 示例输入的三个列表
Foo = [
    {'_id': 'core.system', 'count_enabled': 9, 'count_disabled': 0},
    {'_id': 'core.system', 'count_enabled': 0, 'count_disabled': 0},
    {'_id': 'core.private_channel', 'count_enabled': 4, 'count_disabled': 2}
]
Bar = [
    {'_id': 'core.system', 'count_enabled': 3, 'count_disabled': 1},
    {'_id': 'core.user', 'count_enabled': 5, 'count_disabled': 0}
]
Baz = [
    {'_id': 'core.private_channel', 'count_enabled': 1, 'count_disabled': 3},
    {'_id': 'core.user', 'count_enabled': 2, 'count_disabled': 4}
]

# 合并所有列表
combined_lists = Foo + Bar + Baz

# 初始化临时字典存储累加结果
result_dict = {}
for item in combined_lists:
    item_id = item['_id']
    if item_id not in result_dict:
        # 首次遇到该ID,直接存入字典(用copy避免修改原数据)
        result_dict[item_id] = item.copy()
    else:
        # 已有该ID,累加对应count字段
        result_dict[item_id]['count_enabled'] += item['count_enabled']
        result_dict[item_id]['count_disabled'] += item['count_disabled']

# 转换为列表并按_id排序(可根据需求修改排序规则)
final_list = sorted(result_dict.values(), key=lambda x: x['_id'])

# 打印结果
print(final_list)

简洁版本(使用collections.defaultdict)

如果想让代码更简洁,可以用defaultdict自动初始化count字段:

from collections import defaultdict

# 合并列表
combined_lists = Foo + Bar + Baz

# 用defaultdict自动初始化count为0
result_dict = defaultdict(lambda: {'_id': '', 'count_enabled': 0, 'count_disabled': 0})

for item in combined_lists:
    item_id = item['_id']
    result_dict[item_id]['_id'] = item_id
    result_dict[item_id]['count_enabled'] += item['count_enabled']
    result_dict[item_id]['count_disabled'] += item['count_disabled']

# 排序并转换为列表
final_list = sorted(result_dict.values(), key=lambda x: x['_id'])

代码说明

  • 合并列表:用+操作符直接合并多个列表,简化遍历逻辑
  • 去重累加:通过字典的键唯一性确保每个_id只保留一个条目,遍历过程中完成count字段的累加
  • 排序:使用sorted()函数,通过key参数可以灵活调整排序规则,比如按count_enabled降序排序可以写成key=lambda x: -x['count_enabled']

这个方法的时间复杂度是O(N)(N为所有列表的总元素数),不管列表长度多少都能高效处理,完美适配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:06:52