如何对字典列表排序并插入分组汇总项?
字典列表排序、分组并插入分组汇总项
原始数据
original_data = [ {'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'}, {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'}, {'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'}, {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'} ]
期望结果
expected_result = [ {'A': 'LabelA', 'B': 'DescriptionA', 'C': '5', 'D': '13', 'sum': '1'}, {'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'}, {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'}, {'A': 'LabelB', 'B': 'DescriptionB', 'C': '5', 'D': '13', 'sum': '1'}, {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'}, {'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'} ]
解决方案
通过排序→分组→生成汇总项并合并三个步骤即可实现,以下是Python代码实现:
from itertools import groupby original_data = [ {'A': 'LabelA', 'B': 'DescriptionA', 'C': '1', 'D': '5', 'sum': '0'}, {'A': 'LabelB', 'B': 'DescriptionB', 'C': '2', 'D': '6', 'sum': '0'}, {'A': 'LabelB', 'B': 'DescriptionB', 'C': '3', 'D': '7', 'sum': '0'}, {'A': 'LabelA', 'B': 'DescriptionA', 'C': '4', 'D': '8', 'sum': '0'} ] # 1. 按A、B字段排序,确保同组数据连续 sorted_data = sorted(original_data, key=lambda x: (x['A'], x['B'])) final_result = [] # 2. 按A、B分组处理每组数据 for (label_a, desc_b), group in groupby(sorted_data, key=lambda x: (x['A'], x['B'])): group_items = list(group) # 计算组内C、D的数值和,注意字符串转整数计算后转回字符串 total_c = str(sum(int(item['C']) for item in group_items)) total_d = str(sum(int(item['D']) for item in group_items)) # 3. 生成当前组的汇总项 summary = { 'A': label_a, 'B': desc_b, 'C': total_c, 'D': total_d, 'sum': '1' } # 将汇总项放在组内数据前,添加到最终结果 final_result.append(summary) final_result.extend(group_items) # 输出验证结果 print(final_result)
关键说明
itertools.groupby要求数据必须是已排序的,否则同一个分组会被拆成多个部分,因此排序是分组的前提。- 由于原始数据中C、D字段是字符串类型,求和时需要先转为整数,计算完成后再转回字符串以匹配结果格式。
- 分组返回的是迭代器,需先转为列表才能重复使用(计算总和和后续添加组内数据)。
内容的提问来源于stack exchange,提问作者DrZoidberg09
相关产品推荐
相关产品推荐

