当前位置: 代码迷 >> 综合 >> Python嵌套字典对象的合并
  详细解决方案

Python嵌套字典对象的合并

热度:50   发布时间:2024-02-24 04:11:26.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 ittotal_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 ittotal_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.

 

  相关解决方案