Python 如何在一条表达式里合并两个字典?

Python 合并字典:Python 3.9+ 用管道运算符 z = x | y;通用写法用解包 z = {x, y};就地合并用 x.update(y)。键冲突时后者覆盖前者。本文对比三种写法。

最佳实践
文件、模块与依赖组织示意

Python 3.9+:z = x | y;任何现代版本通用:z = {**x, **y}。

写法一:解包(3.5+,最通用)

x = {'firstname': 'John'}
y = {'lastname': 'Doe'}

z = {**x, **y}
# {'firstname': 'John', 'lastname': 'Doe'}

把两个字典的键值对解包进新字典,原字典不受影响。

写法二:管道运算符(3.9+,最简洁)

z = x | y

结果相同。还有就地版本:x |= y(等价于 update)。

写法三:update(就地合并)

x.update(y)   # y 的内容并入 x,不产生新字典

注意这是修改 x 本身,不是表达式、不返回新字典。

键冲突规则

三种写法一致:后面的覆盖前面的:

x = {'a': 1, 'b': 2}
y = {'b': 99, 'c': 3}

print(x | y)   # {'a': 1, 'b': 99, 'c': 3}  —— y 的 b 覆盖了 x 的

想要"前面优先"就交换顺序,或写 {**y, **x}。

合并多个字典

merged = {**a, **b, **c}     # 解包
merged = a | b | c           # 3.9+ 管道

常见问题(FAQ)

Q:能合并时做值加工吗(比如值相加而不是覆盖)?
单行表达式做不到精细控制,用字典推导式或 collections.Counter(值是数值时 Counter(x) + Counter(y) 直接相加)。

Q:字典里有嵌套字典,深合并怎么写?
以上写法都是浅合并(嵌套字典整体覆盖)。深合并需要自己写递归函数或用第三方库(如 deepmerge)。

Q:| 运算符在 3.8 上报错?
dict | dict 是 3.9 新增。老版本用 {**x, **y}。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台