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}。