Python dict: 深度字典更新, 比update更好用

本文介绍了如何在Python中深度更新字典,以避免覆盖原有字典的深层结构。通过自定义`dict_update`函数,实现了递归更新和添加新键值对的功能,确保所有层级的字典都能正确更新。示例展示了如何处理两个嵌套字典的更新操作,以达到预期结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在进行字典更新时, 我们通常都是用update函数, 但这个函数只能更新第一层, 如果第2/3/...层也需要更新的, 就不能再用update了, 否则从第2层起都会被覆盖;

由于暂时没有找到合适的方法, 就自己写了一个函数, 来进行字典的深度更新, 可以代替update, 能够满足浅层和深层的更新.

1. 问题描述

先定义两个字典:

dict_1 = {"A": 1, "B": {"b1": 1, "b2": 2}}
dict_2 = {"B": {"b2": 22, "b3": 3, "b4": {"bb1": 1}}, "C": 3}

我们想要达到的目的是: 使用dict_2来更新dict_1, 将dict_2中有而dict_1没有的key更新到dict_1, 同时将其共有的key更新为dict_2中的内容;

按照这个要求, 我们期望的结果应该是:

{'A': 1, 'B': {'b1': 1, 'b2': 22, 'b3': 3, 'b4': {'bb1': 1}}, 'C': 3}

如果我们直接用自带的update来更新, 效果是这样的:

dict_1.update(dict_2)
print(dict_1)
# result: {'A': 1, 'B': {'b2': 22, 'b3': 3, 'b4': {'bb1': 1}}, 'C': 3}

可见, update会直接把第一层的value直接覆盖过去, 对于dict_1['B']直接替换为了dict_2['B'], 导致dict_1['B']['b1']丢失; 这显然不是我们想要的结果.

2. 解决方案

解决的思路很简单, 分两步:

对于原dict有而新dict没有的key,  递归进行赋值;

对于新dict有而原dict没有的key, 添加到原dict中;

代码实现如下:

def dict_update(raw, new):
    dict_update_iter(raw, new)
    dict_add(raw, new)


def dict_update_iter(raw, new):
    for key in raw:
        if key not in new.keys():
            continue
        if isinstance(raw[key], dict) and isinstance(new[key], dict):
            dict_update(raw[key], new[key])
        else:
            raw[key] = new[key]


def dict_add(raw, new):
    update_dict = {}
    for key in new:
        if key not in raw.keys():
            update_dict[key] = new[key]

    raw.update(update_dict)


if __name__ == '__main__':
    dict_1 = {"A": 1, "B": {"b1": 1, "b2": 2}}
    dict_2 = {"B": {"b2": 22, "b3": 3, "b4": {"bb1": 1}}, "C": 3}
    # dict_1.update(dict_2)
    dict_update(dict_1, dict_2)
    print(dict_1)

使用了dict_update函数, dict_1的内容就成了:

{'A': 1, 'B': {'b1': 1, 'b2': 22, 'b3': 3, 'b4': {'bb1': 1}}, 'C': 3}

目标达成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AICVHub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值