Python巢狀字典物件的合併

2021-10-09 22:05:00 字數 2086 閱讀 8881

有些場合,資料使用巢狀的字典來儲存結構比較清晰,且檢索還比較方便快捷。

但是在巢狀字典資料合併時,簡單的使用一次 {}.update() 不能正確的合併資料,例如

total_dic = }}

item_dic = }}

按照我們儲存資料的設想,合併後的結果應該是

, 5: }}
但是執行下面的指令

total_dic.update(item_dic)

print(total_dic)

輸出是

}}
即,如果 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()

elif isinstance(item_value, dict):

update_dic(total_value, item_value)

total_dic.update()

else:

print('error: value collision.')

return # nothing. total_dic is mutable, and it's value is updated in-place.

測試一下

total_dic = }}

item_dic = }}

updata_dic(total_dic, item_dic)

print(total_dic)

輸出

, 5: }}
如我所願。

注意:上面的**針對的是末端資料不能合併的情形,即,如果所有層級的 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()

elif isinstance(item_value, dict):

update_dic(total_value, item_value)

total_dic.update()

else:

# your_operation() is your own value processing function.

total_value = your_operation(total_value, item_value)

total_dic.update()

return # nothing. total_dic is mutable, and it's value is updated in-place.

Python字典巢狀

1 import copy 2 menu 10 程式設計 11,17 伺服器程式設計 18,23 24 網頁設計 31 後端 32353637 38 3940 41 menu copy copy.deepcopy menu 424344 print menu copy.pop 電腦科學與技術 字典巢...

Python字典的巢狀操作

在機器學習中會用字典的巢狀來儲存決策樹的資訊,對繪製樹形圖有很大的作用,其中巢狀字典的生成是乙個遞迴的過程 如下所示 s b 構造字典 s a 0 取值 no s a 1 s a 1 flippers 1 maybe 巢狀構造過程 s s no sur 0 no s ss ss fli 0 no s...

Python 「合併字典」

def count dicts dict1,dict2 differ set dict1 set dict2 same set dict1 set dict2 print same print differ for key in same dict1 key dict2 key for key in...