合并多组字典列表:去重并累加重复项指定字段值后排序
合并字典列表并按ID去重求和的解决方案
我来帮你搞定这个需求,处理这类带重复ID的统计数据合并问题,用临时字典来跟踪累加值是最高效清晰的方式。下面是具体的实现步骤和代码示例:
核心思路
- 先把所有需要合并的列表整合为一个大列表,统一处理
- 用一个字典以
_id为键,存储每个ID对应的累加后的数据 - 遍历所有元素,对相同ID的
count_enabled和count_disabled字段进行累加 - 最后将处理后的字典转换为列表,并按需求排序
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
相关产品推荐
相关产品推荐

