遍历订单时,用 defaultdict(list) 给每个客户准备独立的列表,按客户 id 把订单追加进去。它适合一位客户对应多笔订单、且后续还要保留订单明细的场景。

用客户 ID 建立订单分组
保存为 group_orders.py。输入是订单列表,分组键取 customer_id。
from collections import defaultdict
orders = [
{"customer_id": "A", "order_id": 101, "cents": 3200},
{"customer_id": "B", "order_id": 102, "cents": 1500},
{"customer_id": "A", "order_id": 103, "cents": 800},
]
groups = defaultdict(list)
for order in orders:
groups[order["customer_id"]].append(order)
print([item["order_id"] for item in groups["A"]])

运行后得到 [101, 103]。A 组内部保留两笔订单的输入顺序。
在保留明细的基础上计算每组总额
追加下面的代码,用整数分累计金额。
totals = {
customer: sum(order["cents"] for order in group)
for customer, group in groups.items()
}
assert totals == {"A": 4000, "B": 1500}
print(totals)
分组保留的是原订单对象。只需总额时可以直接用 defaultdict(int) 累加,省去存放列表的空间。
查询不存在的客户时避免创建空组
方括号访问缺失键会调用工厂函数。只读查询可以用 get。
before = len(groups)
assert groups.get("C", []) == []
assert len(groups) == before
assert groups["C"] == []
assert len(groups) == before + 1
如果后续要统计实际下单人数,查询空客户时使用 get,避免把空组算进去。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











