我有兩個嵌套字典,它們可能包含相同的鍵但具有不同的值(即不同的內部字典但外部具有相同的鍵)
例如:
dict_a = {"2": {"2": 0, "12": "94960", "25": "61026"}, "229": {"101": "29043", "106": "25298", "110": "48283", "112": "16219", "126": "35669", "147": "37675"}}
dict_b = {{"1": {"1": 0, "2": "84543", "3": "34854", "5": "123439}, "229": {"2": "71355", "12": "24751", "25": "33600", "229": 0}}
這里的關鍵“229”存在于兩個外部字典中,但與不同的值相關聯(不同的內部字典)
我首先得到dict_a,然后我得到dict_b。然后我想用從 dict_b 添加的所有鍵和值更新 dict_a。IE
dict_a_updated = {"2": {"2": 0, "12": "94960", "25": "61026"}, "229": {"101": "29043", "106": "25298", "110": "48283", "112": "16219", "126": "35669", "147": "37675", "2": "71355", "12": "24751", "25": "33600", "229": 0}}}
{{"1": {"1": 0, "2": "84543", "3": "34854", "5": "123439}}
我試過 .update 方法:
dict_a_updated = dict_a.update(dict_b)
結果是鍵“229”及其來自 dict_b 的值將覆寫 dict_a 中的值。不需要覆寫,因為我想繼續為現有鍵添加新值。這樣做的正確方法是什么?
uj5u.com熱心網友回復:
您必須決定要合并多少級嵌套字典,但這是非常可行的:
dict_a = {"2": {"2": 0, "12": "94960", "25": "61026"},
"229": {"101": "29043", "106": "25298", "110": "48283", "112": "16219", "126": "35669", "147": "37675"}}
dict_b = {"1": {"1": 0, "2": "84543", "3": "34854", "5": "123439"},
"229": {"2": "71355", "12": "24751", "25": "33600", "229": 0}}
for k, v in dict_b.items():
if k in dict_a:
for sub_k, sub_v in v.items():
if sub_k in dict_a[k]: #decide what to do when there's a conflict at this level
print("conflict: keeping value from dict_a")
else:
dict_a[k][sub_k] = sub_v #add missing item to dict_a[k]
else:
dict_a[k] = v #add missing item to dict_a
print(dict_a)
將問題擴展到合并任意數量的級別是一個簡單的遞回問題(盡管您必須確保資料結構一致,并決定如何解決資料沖突):
def recursive_merge(dict_a, dict_b, levels):
for k, v in dict_b.items():
if k in dict_a:
if levels > 1 and isinstance(v, dict) and isinstance(dict_a[k], dict):
recursive_merge(dict_a[k], dict_b[k], levels - 1)
else:
pass #keep the value from dict_a
else:
dict_a[k] = v
return dict_a
print(recursive_merge(dict_a, dict_b, 2))
uj5u.com熱心網友回復:
您需要合并兩個字典中的每個嵌套字典,以生成合并字典的新嵌套合并字典。你可以用字典理解來做到這一點:
dict_a_updated = {k: {**dict_a.get(k, {}), **dict_b.get(k, {})}
for k in {*dict_a, *dict_b}}
這將生成一組外部 dict 的所有鍵的集合{*dict_a, *dict_b},并基于該鍵生成一個具有這些鍵 ( k)的新 dict ,其值是兩個dict ( ) 的那些鍵的值的合并{**dict_a.get(k, {}), **dict_b.get(k, {})}。
uj5u.com熱心網友回復:
這是python 3.9 您的問題的簡單解決方案:
dict_a = {'c': {1, 3, 5}, 'b': {0}}
dict_b = {'c': {2, 4, 6}, 'd': {7}}
for (key, val) in dict_b.items():
if a_vals := dict_a.get(key):
dict_a[key] = a_vals | val
else:
dict_a[key] = val
您遍歷第二個字典中的 <key, dict> 對。如果第一個字典包含相同的鍵,則使用|python 3.9 中引入的 new運算符合并兩個字典。
如果第一個字典不包含鍵,則添加它并將第二個字典中的字典分配給它。
在例子中的代碼之后,這里是dict_a的內容:
In [1]: dict_a
Out[1]: {'c': {1, 2, 3, 4, 5, 6}, 'b': {0}, 'd': {7}}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322852.html
