
本文介绍一种简洁高效的方法,将具有重复分组字段(如 id、table、category)的字典列表,聚合为以这些字段为顶层键、子项归入统一 products 列表的嵌套字典结构,无需依赖 itertools.groupby。
本文介绍一种简洁高效的方法,将具有重复分组字段(如 id、table、category)的字典列表,聚合为以这些字段为顶层键、子项归入统一 products 列表的嵌套字典结构,无需依赖 itertools.groupby。
在数据处理中,常需将扁平化的记录列表(如数据库查询结果或 API 响应)按逻辑维度聚合成嵌套结构,提升可读性与后续操作效率。例如,将多个同属一个订单(id)、餐桌(table)和品类(category)的商品记录,合并为单个对象,并将其商品明细以 products 列表形式嵌套存储。
核心思路是:以目标分组字段为复合键,用字典实现 O(1) 分组累积。相比 itertools.groupby(要求输入已排序且逻辑较重),纯字典方案更直观、鲁棒且性能优异。
以下为推荐实现:
list_dict = [
{'id': 1, 'table': 8, 'category': 'fruit', 'product': 'banana', 'price': 4, 'qty': 5},
{'id': 1, 'table': 8, 'category': 'fruit', 'product': 'apple', 'price': 5, 'qty': 9},
{'id': 1, 'table': 8, 'category': 'fruit', 'product': 'orange', 'price': 6, 'qty': 3},
{'id': 2, 'table': 5, 'category': 'vegetable', 'product': 'carrot', 'price': 4, 'qty': 5},
{'id': 2, 'table': 5, 'category': 'vegetable', 'product': 'potato', 'price': 2, 'qty': 3}
]
# 步骤1:使用元组作为复合键,构建分组映射
grouped = {}
for item in list_dict:
key = (item['id'], item['table'], item['category'])
# 提取需嵌套的字段,构造子字典
product_info = {
'product': item['product'],
'price': item['price'],
'qty': item['qty']
}
grouped.setdefault(key, []).append(product_info)
# 步骤2:将分组结果转换为最终嵌套列表
result = [
{
'id': key[0],
'table': key[1],
'category': key[2],
'products': items
}
for key, items in grouped.items()
]
print(result)✅ 输出符合预期:每个唯一 (id, table, category) 组合生成一个顶层字典,其 products 字段包含该组全部商品明细。
⚠️ 注意事项:
- 确保分组字段(如 'id', 'table', 'category')在所有字典中均存在且类型一致,否则会触发 KeyError;可添加 try/except 或使用 dict.get() 做防御性编程;
- 若原始数据量极大,此方法仍保持线性时间复杂度 O(n),内存占用可控;
- 如需保留原始顺序(如按首次出现的 id 排序),可在最后对 result 按 key[0] 排序:sorted(result, key=lambda x: x['id']);
- 扩展性强:只需修改 key 元组构成与 product_info 字段映射,即可适配任意分组逻辑与嵌套结构。
该方法简洁、可读、无外部依赖,是 Python 中字典列表聚合任务的标准实践之一。

















