Python嵌套字典对象的合并

2 篇文章 0 订阅
2 篇文章 0 订阅

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

但是在嵌套字典数据合并时,简单的使用一次 {}.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.

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值