如何对动态字典列表按每4个字典汇总相同键值?
分组汇总字典列表的实现方案
问题描述
我有如下格式的字典列表:
[{'success': 10, 'failed': 15, 'manual': 20}, {'manual': 5, 'success': 10}, {}, {}, {'success': 20, 'manual': 25, 'failed': 30}, {'success': 2, 'manual': 4, 'failed': 6}, {}, {}]
希望按每4个字典为一组,汇总各组内相同键的数值,最终得到如下格式的结果:
[{'success': 20, 'failed': 15, 'manual': 25}, {'success': 22, 'manual': 29, 'failed': 36}]
请问如何实现这一需求以适配动态长度的列表?
实现方案
思路解析
- 动态分组:将原列表按指定大小(这里是4)拆分,自动适配任意长度的输入列表,最后一组不足4个元素也正常处理。
- 键值累加:对每个分组内的所有字典,遍历键值对,相同键的数值进行累加,得到分组的汇总字典。
代码实现(使用collections.defaultdict)
from collections import defaultdict def group_and_sum(dict_list, group_size=4): # 按指定大小拆分列表为多个分组 groups = [dict_list[i:i+group_size] for i in range(0, len(dict_list), group_size)] result = [] for group in groups: sum_dict = defaultdict(int) # 遍历分组内的每个字典,累加键值 for d in group: for key, value in d.items(): sum_dict[key] += value # 转换为普通字典,匹配示例输出格式 result.append(dict(sum_dict)) return result # 测试用例 input_list = [ {'success': 10, 'failed': 15, 'manual': 20}, {'manual': 5, 'success': 10}, {}, {}, {'success': 20, 'manual': 25, 'failed': 30}, {'success': 2, 'manual': 4, 'failed': 6}, {}, {} ] # 执行并输出结果 print(group_and_sum(input_list))
无依赖版本(不使用collections)
如果不想引入额外模块,用普通字典实现:
def group_and_sum(dict_list, group_size=4): groups = [dict_list[i:i+group_size] for i in range(0, len(dict_list), group_size)] result = [] for group in groups: sum_dict = {} for d in group: for key, value in d.items(): if key in sum_dict: sum_dict[key] += value else: sum_dict[key] = value result.append(sum_dict) return result
代码说明
- 分组逻辑:利用列表切片
dict_list[i:i+group_size],步长设为group_size,可以快速将列表拆分为指定大小的子列表,自动处理动态长度的输入。 - 累加逻辑:使用
defaultdict(int)可以避免手动判断键是否存在,直接累加数值;普通字典版本则通过判断键是否存在来处理初始化和累加。 - 结果输出:每个分组的汇总结果会被添加到最终列表中,输出格式与需求一致。
内容的提问来源于stack exchange,提问作者bikash_sb
相关产品推荐
相关产品推荐

