
本文介绍如何将 dict_2 中每个键对应的集合值安全地合并(并集)到 dict_1 的对应键中,避免重复、不破坏原有数据,并解决“unhashable type: 'set'”错误。
本文介绍如何将 dict_2 中每个键对应的集合值安全地合并(并集)到 dict_1 的对应键中,避免重复、不破坏原有数据,并解决“unhashable type: 'set'”错误。
在 Python 中处理嵌套集合字典时,常见需求是「原地扩展」或「生成新字典」,将第二个字典中同键的集合元素追加到第一个字典对应键的集合中(即执行集合并集操作)。直接使用 list.append() 或 set.add() 会出错,根本原因在于:集合(set)是可变对象,不可哈希,不能作为另一个集合的元素——这正是你遇到 unhashable type: 'set' 错误的根源(例如 to_add.add(dict_1[x]) 尝试把整个 set 对象加入新集合)。
✅ 正确做法是使用集合的 并集运算符 |(等价于 set.union()),它返回一个新集合,包含两个集合的所有唯一元素:
dict_1 = {1: {2}, 2: {3}, 3: {4}, 4: {11}}
dict_2 = {1: {2}, 2: {1}, 3: {4}, 4: {1, 3}}
# 方案一:仅处理 dict_1 中已存在的键(推荐用于键完全对齐场景)
merged = {k: dict_1[k] | dict_2[k] for k in dict_1}
# 输出:{1: {2}, 2: {1, 3}, 3: {4}, 4: {1, 3, 11}}⚠️ 注意:该写法要求 dict_1 和 dict_2 键集一致;若 dict_2 包含 dict_1 没有的键,会触发 KeyError。
✅ 更健壮的方案(推荐生产环境使用):覆盖所有可能出现的键(即 dict_1 ∪ dict_2 的键),对缺失键默认使用空集合 set():
dict_1 = {1: {2}, 2: {3}, 3: {4}, 4: {11}, 5: {10, 12}}
dict_2 = {1: {2}, 2: {1}, 3: {4}, 4: {1, 3}, 6: {1, 2}}
# 合并所有键,缺失键用空集兜底
merged = {k: dict_1.get(k, set()) | dict_2.get(k, set())
for k in dict_1.keys() | dict_2.keys()}
# 输出:{1: {2}, 2: {1, 3}, 3: {4}, 4: {1, 3, 11}, 5: {10, 12}, 6: {1, 2}}? 关键要点总结:
- ❌ 不要尝试 add() 整个集合对象(导致 unhashable 错误);
- ✅ 使用 | 运算符或 set.union() 实现高效、安全的集合合并;
- ✅ 利用 .get(key, default) 避免 KeyError,提升鲁棒性;
- ✅ dict_1.keys() | dict_2.keys() 是获取两字典键并集的简洁写法(因 dict_keys 支持集合运算);
- ? 如需原地更新 dict_1(而非生成新字典),可改用循环:
for k in dict_1.keys() | dict_2.keys(): dict_1[k] = dict_1.get(k, set()) | dict_2.get(k, set())
此方法时间复杂度为 O(n + m),内存友好,且语义清晰,是处理多层集合字典合并的标准实践。

















