假設我有兩個由多級集合組成的字典:
houses:
- house4:
- level1:
- unitA
- unitB
- level8:
- unitG
- house6:
- level5:
- unitK
和
houses:
- house6:
- level4:
- unitT
- level5:
- unitK
- house3:
- level8:
- unitG
將它們組合在一起而不重復的最有效方法是什么?
我可以撰寫一個三級回圈并通過將每個子集與 set.union 重新組合來生成一個新的 dict ,但那種看起來不太好。
uj5u.com熱心網友回復:
假設這些字典的最后一級是字串集,您可以使用嵌套回圈:
for k1,v1 in b.items(): # e.g. 'houses': {...
d1 = a.setdefault(k1,dict())
for k2,v2 in v1.items(): # e.g. 'house6': {...
d2 = d1.setdefault(k2,dict())
for k3,v3 in v2.items(): # e.g. 'level4': {'unitT'}
d2.setdefault(k3,list()).update(v3)
請注意,添加到子詞典a是新的情況下(在那些沒有參考b。因此,如果內容b結構改變后,您將無法獲得在不良副作用a結構。
如果字典中的級別數未知,您可以定義一個遞回函式,該函式對任意數量的級別執行相同的操作:
def merge(a,b):
if isinstance(a,dict):
for k,v in b.items(): merge(a.setdefault(k,type(v)()),v)
elif isinstance(a,set): a.update(b)
elif isinstance(a,list): a.extend(b)
uj5u.com熱心網友回復:
假設單位是集合,您可以使用 2 個 for 回圈來完成。
迭代b并檢查其中的房屋是否存在于 中a,如果不存在則將其添加到a. 如果是,則遍歷該房屋中的級別并檢查其中的級別是否存在于 中的同一房屋中a。如果有,則將這些新單元添加到 中的現有級別a,如果沒有,則將此級別添加到 中的同一房屋中a:
for house, levels in b.items():
if house in a:
for level, units in levels.items():
if level in a[house]:
a[house][level].update(units)
else:
a[house][level] = units
else:
a[house] = levels
也可以使用以下方法構建相同的內容dict.setdefault:
for house, levels in b.items():
a.setdefault(house, dict())
for level, units in levels.items():
a[house].setdefault(level, set()).update(units)
print(a)
輸出:
{'house4': {'level1': {'unitA', 'unitB'}, 'level8': ['unitG']},
'house6': {'level6': {'unitK'}, 'level4': {'unitT'}, 'level5': {'unitK'}},
'house3': {'level8': {'unitG'}}}
新解決方案:
for house, levels in b.items():
a.setdefault(house, [])
for level in levels:
a[house].append(level)
uj5u.com熱心網友回復:
a ={"house4": {
"level1": ["unitA", "unitB"],
"level8": ["unitG"],
},
"house6": {
"level6": ["unitK"]
}
}
b = {"house6": {
"level4": ["unitT"],
"level5": ["unitK"]
},
"house3": {
"level8": ["unitG"]
}
}
a.update(b)
“a”中的鍵被“b”替換,即“a”一旦更新將具有字典“b”中的“house 6”值。如果您需要在字典中解決較低級別的重復項,請確保發布一個問題來演示您所需要的內容——不清楚。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/387579.html
