如何合并两个键集合完全相同的字典,实现嵌套字典键值对合并而非替换
合并键集合完全相同的嵌套字典(新增值而非替换)
嘿,这个需求挺常见的,而且因为你明确说两个字典的顶层键集合完全一致,实现起来特别顺手!我给你几个不同的实现方式,按需选就行~
首先先修正一下你给出的示例数据(Python里键需要加引号,且不能用0100这种八进制写法,除非你真的要八进制值,这里我默认你是想写十进制的100和400):
dict_1 = {"a": {"price": 4000}, "b": {"price": 14000}} dict_2 = {"a": {"discount": 100}, "b": {"discount": 400}}
方法1:直观循环法(适合新手理解)
因为两个字典的顶层键完全匹配,我们可以直接遍历其中一个字典的键,然后把对应位置的子字典合并:
merged_dict = {} for key in dict_1: # 用字典解包操作符`**`把两个子字典的键值对合并成新字典 merged_dict[key] = {**dict_1[key], **dict_2[key]}
这个方法的逻辑很清晰:先创建一个空字典,然后逐个处理每个顶层键,把两个子字典的内容合并后存入新字典。因为子字典的键(price和discount)不重复,所以不会出现值被覆盖的问题。
方法2:字典推导式(更Pythonic,一行搞定)
如果喜欢简洁的代码,可以把上面的循环改成字典推导式,逻辑完全一样,只是写法更紧凑:
merged_dict = {key: {**dict_1[key], **dict_2[key]} for key in dict_1}
方法3:原地修改原有字典(无需创建新字典)
如果你不需要保留原来的dict_1,可以直接在dict_1的基础上更新,用字典的update()方法:
for key in dict_1: dict_1[key].update(dict_2[key]) # 此时dict_1就是合并后的结果:{"a": {"price": 4000, "discount": 100}, "b": {"price": 14000, "discount": 400}}
update()方法会把第二个字典的键值对添加到第一个字典中,同样因为子字典的键不重复,只会新增值而不会替换原有内容。
补充说明
因为你明确两个字典的顶层键完全相同,所以以上方法都不需要处理键缺失的情况。如果以后遇到键可能不一致的场景,只需要把遍历的键改成dict_1.keys() | dict_2.keys()(获取所有唯一键)即可,但这里完全用不上~
内容的提问来源于stack exchange,提问作者uber
相关产品推荐
相关产品推荐

