
本文介绍如何将包含多个字典的列表,按字典的键集合(key set)自动分组并聚合值,生成结构清晰的归类结果——适用于处理异构但语义相似的半结构化数据。
本文介绍如何将包含多个字典的列表,按字典的**键集合(key set)自动分组并聚合值**,生成结构清晰的归类结果——适用于处理异构但语义相似的半结构化数据。
在实际数据处理中,我们常遇到一类“伪同构”字典列表:每个字典字段不完全一致(如有的含 'fruit',有的含 'Veggie'),但具有相同的键组合(即 key set 相同),逻辑上属于同一类别。目标是将这些键集相同的字典归为一组,并将各字段的值分别收集为列表,形成结构化的聚合结果。
核心思路是:以字典的键集合(frozenset(d.keys()))作为分组依据,因为 frozenset 可哈希且忽略键序,能精准识别“结构相同”的字典(例如 {'fruit':..., 'Color':..., 'weight':...} 总是匹配同一组,无论键顺序如何)。
以下是推荐实现方案(简洁、健壮、无第三方依赖):
lst = [
{"fruit": "Apple", "Color": "red", "weight": "10"},
{"fruit": "Banana", "Color": "yellow", "weight": "20"},
{"fruit": "Kiwi", "Color": "Green", "weight": "15"},
{"Veggie": "Onion", "Color": "white", "price": "10"},
{"Veggie": "Cabbage", "Color": "Light Green", "price": "30"},
{"Leafy": "Spinach", "Color": "Dark Green", "quantity": "30"},
]
# 步骤1:按键集合分组(使用 frozenset 保证可哈希)
groups = {}
for d in lst:
key_set = frozenset(d.keys())
groups.setdefault(key_set, []).append(d)
# 步骤2:对每组生成聚合字典:每个键 → 对应所有字典中该键的值组成的列表
result = []
for keys, dicts_in_group in groups.items():
aggregated = {}
for k in keys: # 遍历该组共有的所有键
aggregated[k] = [d[k] for d in dicts_in_group]
result.append(aggregated)
print(result)
✅ 输出符合预期:
[
{'fruit': ['Apple', 'Banana', 'Kiwi'], 'Color': ['red', 'yellow', 'Green'], 'weight': ['10', '20', '15']},
{'Veggie': ['Onion', 'Cabbage'], 'Color': ['white', 'Light Green'], 'price': ['10', '30']},
{'Leafy': ['Spinach'], 'Color': ['Dark Green'], 'quantity': ['30']}
]
⚠️ 注意事项与进阶建议:
- 键名大小写敏感:示例中 'Color' 与 'color' 会被视为不同键。若需忽略大小写,预处理时统一转为 .lower();
- 空字典处理:含空字典({})会生成 frozenset(),建议提前过滤或单独处理;
- 性能优化:对于超大列表(>10⁵项),可改用 defaultdict(list) 替代 setdefault,略微提升效率;
- 扩展性:若需按自定义规则分组(如“主键前缀相同”),可将 frozenset(d.keys()) 替换为 get_group_key(d) 自定义函数;
- 类型安全:当前代码假设所有字典中同一键均有值。若存在缺失键(如某字典无 'Color'),需增加 d.get(k) 或异常捕获逻辑。
该方法不依赖 pandas 或 itertools,纯 Python 实现,逻辑清晰、易于调试,是处理轻量级异构字典聚合任务的首选模式。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











