Python嵌套字典对象的合并

本文探讨了在Python中如何处理嵌套字典的合并问题,指出默认的`.update()`方法无法正确处理这种情况。通过提供自定义函数`update_dic`,实现了逐层更新嵌套字典的功能,确保原有数据不会被覆盖。同时,文章还提到了如果末端数据可合并,如何修改代码进行相应操作。这是一个关于Python数据结构和字典操作的实用技巧分享。

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

有些场合,数据使用嵌套的字典来存储结构比较清晰,且检索还比较方便快捷。

但是在嵌套字典数据合并时,简单的使用一次 {}.update() 不能正确的合并数据,例如
 

total_dic = {1:{2:{3:4}}}
item_dic = {1:{5:{6:7}}}

按照我们存储数据的设想,合并后的结果应该是

{1: {2: {3: 4}, 5: {6: 7}}}

但是执行下面的指令

total_dic.update(item_dic)
print(total_dic)

输出是

{1: {5: {6: 7}}}

即,如果 total_dic 的第一级 value 与 item_dic 的第一级 value 相同个,则 total_dic 原有的数据被覆盖,而不是如我们所愿,将更内级别的数据逐层更新。

为此,使用自定义代码实现所需功能

def update_dic(total_dic, item_dic):
    '''
    Updater of multi-level dictionary.
    
    Last level value is unmergable.
    '''
    for idd in item_dic.keys():
        total_value = total_dic.get(idd)
        item_value  = item_dic.get(idd)
        
        if total_value == None: # not exist, just add it
            total_dic.update({idd : item_value})
        elif isinstance(item_value, dict):
            update_dic(total_value, item_value)
            total_dic.update({idd : total_value})
        else:
            print('ERROR: value collision.')
    
    return # nothing. total_dic is mutable, and it's value is updated in-place.

测试一下

total_dic = {1:{2:{3:4}}}
item_dic = {1:{5:{6:7}}}

updata_dic(total_dic, item_dic)
print(total_dic)

输出

{1: {2: {3: 4}, 5: {6: 7}}}

如我所愿。

注意:上面的代码针对的是末端数据不能合并的情形,即,如果所有层级的 key 都一样,则认为存在数据冲突,什么也不做。

如果根据使用场景,末端数据可以做合并操作,如四则运算、列表的拼接等等,则需要修改 update_dic 如下:

def update_dic(total_dic, item_dic):
    '''
    Updater of multi-level dictionary.
    
    Last level value is unmergable.
    '''
    for idd in item_dic.keys():
        total_value = total_dic.get(idd)
        item_value  = item_dic.get(idd)
        
        if total_value == None: # not exist, just add it
            total_dic.update({idd : item_value})
        elif isinstance(item_value, dict):
            update_dic(total_value, item_value)
            total_dic.update({idd : total_value})
        else:
            # your_operation() is your own value processing function.
            total_value = your_operation(total_value, item_value)
            total_dic.update({idd : total_value})
    
    return # nothing. total_dic is mutable, and it's value is updated in-place.

 

### Python字典嵌套使用方法 在 Python 中,字典是一种非常灵活的数据结构,可以通过嵌套的方式表示复杂的层次化数据。以下是关于嵌套字典的一些基本操作: #### 创建嵌套字典 嵌套字典是指字典中的值本身也是一个字典。这种结构非常适合用来存储具有层级关系的数据。 ```python nested_dict = { 'level1': { 'key1': 'value1', 'key2': 'value2' }, 'level2': { 'keyA': {'subKey1': 'subValue1'}, 'keyB': {'subKey2': 'subValue2'} } } ``` #### 访问嵌套字典 要访问嵌套字典中的某个特定值,只需依次指定每一层的键即可[^1]。 ```python print(nested_dict['level2']['keyA']['subKey1']) # 输出 subValue1 ``` #### 修改嵌套字典 修改嵌套字典中的值与普通字典相同,只需要定位到目标位置并赋新值。 ```python nested_dict['level2']['keyA']['subKey1'] = 'newSubValue1' # 修改子级值 ``` #### 删除嵌套字典中的项 删除嵌套字典中的某一项同样遵循标准语法 `del`,需注意的是如果删除顶层键,则其下所有子级都会被移除[^1]。 ```python del nested_dict['level2']['keyA'] ``` --- ### 合并嵌套字典的方法 当需要合并两个嵌套字典时,可以采用多种方式来完成这一任务。下面介绍两种常见的方法:一种基于递归函数实现深拷贝合并;另一种则通过更新机制逐步覆盖原有字典的内容。 #### 方法一:递归函数实现深拷贝合并 这种方法适用于希望保留原始输入不变的情况下生成一个新的合并后的字典实例。它能够自动处理不同级别的嵌套情况,并且对于重复的键,默认以后者为准[^2]。 ```python def merge(dict_1, dict_2): result = dict_1.copy() for k, v in dict_1.items(): if isinstance(v, dict) and k in dict_2: assert isinstance(dict_2[k], dict), f"For key {k}, value in dict_1 is dict, but is not in dict_2." merged_value = merge(dict_1[k], dict_2.pop(k)) result[k] = merged_value elif k in dict_2: result[k] = dict_2.pop(k) result.update(dict_2) return result # 示例调用 dict_a = {'a': 1, 'b': {'c': 2}} dict_b = {'b': {'d': 3}, 'e': 4} merged_result = merge(dict_a, dict_b) print(merged_result) # 输出 {'a': 1, 'b': {'c': 2, 'd': 3}, 'e': 4} ``` #### 方法二:原地更新法 该方法直接作用于第一个字典之上,在遍历第二个字典的过程中逐层替换或扩展相应部分。需要注意的是这种方式会改变传入的第一个参数的实际状态[^3]。 ```python def update_dic(total_dic, item_dic): for idd in item_dic.keys(): total_value = total_dic.get(idd) item_value = item_dic.get(idd) if total_value is None: total_dic.update({idd: item_value}) elif isinstance(item_value, dict): update_dic(total_value, item_value) total_dic.update({idd: total_value}) else: print('ERROR: value collision.') return # 示例调用 total = {'x': {'y': 10}} item = {'x': {'z': 20}} update_dic(total, item) print(total) # 输出 {'x': {'y': 10, 'z': 20}} ``` --- ### 总结 无论是创建还是管理嵌套字典Python 都提供了强大的支持手段。针对具体需求可以选择合适的策略来进行操作,比如简单的浅层复制或者深层次的递归融合等技术都可以满足不同的应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值