有些场合,数据使用嵌套的字典来存储结构比较清晰,且检索还比较方便快捷。
但是在嵌套字典数据合并时,简单的使用一次 {}.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.