直接用 dict1.keys() & dict2.keys() 只能得到共有键,而非键值都相同的键值对;需用字典推导式 {k: dict1[k] for k in dict1.keys() & dict2.keys() if dict1[k] == dict2[k]} 才能准确获取共有键值对,兼容不可哈希值。

直接用 dict1.keys() & dict2.keys() 就能拿到共有键,但“共有键值”不是指键相同,而是键相同且对应值也相等——这点极易误解,必须先明确。
为什么 .keys() & .keys() 不够用
很多人看到“共有键值”第一反应是取键交集,但实际需求常是“键相同且值也相同”的键值对。比如:
dict1 = {'a': 1, 'b': 2, 'c': 3}
dict2 = {'b': 2, 'c': 4, 'd': 5}
键交集是 {'b', 'c'},但真正“键值都相同”的只有 'b': 2。所以仅靠 .keys() 操作会多算 'c'。
-
dict1.keys() & dict2.keys()只保证键存在,不校验值 - 若需严格匹配键+值,得遍历或构造可比对象
- Python 3.9+ 的
dict.items()返回视图对象,支持&,但前提是值可哈希(如 list、dict 不行)
安全又通用的写法:用字典推导式 + 键交集
先求键交集,再逐个比对值,兼容所有类型(包括不可哈希值):
立即学习“Python免费学习笔记(深入)”;
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
common_items = {k: dict1[k] for k in dict1.keys() & dict2.keys() if dict1[k] == dict2[k]}
这行代码清晰表达了意图,且无兼容性风险:
- 左侧
dict1.keys() & dict2.keys()是 O(min(m,n)),比全遍历快 -
if dict1[k] == dict2[k]支持 list、numpy array、自定义对象(只要实现__eq__) - 不依赖
items()的哈希要求,比直接dict1.items() & dict2.items()更鲁棒
想用 items() 快速交集?注意这些限制
如果确认两个字典的值都是可哈希类型(str、int、tuple 等),可以用:
common_items = dict(dict1.items() & dict2.items())
但务必检查是否满足条件:
- 出现
TypeError: unhashable type: 'list'就说明某个值是 list/dict/set —— 此时必须退回上一种写法 -
items()视图的&操作本质是集合交集,性能略优,但可读性不如字典推导式 - Python 3.7+ 保持插入顺序,结果字典顺序与
dict1一致;3.6 及更早版本顺序不保证
真正容易被忽略的是“值是否可哈希”这个隐含前提——很多线上 bug 就出在测试数据全是 int/str,上线后遇到嵌套结构就崩了。动手前先 print([type(v) for v in list(dict1.values()) + list(dict2.values())]) 看一眼最稳妥。

















