[英]Appending (not replacing) items in a nested dictionary via a list of keys
這是對以下問題的跟進:
上述鏈接中給出的所有解決方案都允許通過鍵列表替換/創建嵌套字典的值。 但我的要求是將另一個字典附加(更新)到值。
如果我的字典如下:
dataDict = {
"a":{
"r": 1,
"s": 2,
"t": 3
},
"b":{
"u": 1,
"v": {
"x": 1,
"y": 2,
"z": 3
},
"w": 3
}
}
我的密鑰列表如下:
maplist = ["b", "v"]
如何使用我的地圖列表將另一個 dict 說"somevalue": {}
附加到dataDict['b']['v']
?
因此,在添加新的 dataDict 后,將如下所示:
dataDict = {
"a":{
"r": 1,
"s": 2,
"t": 3
},
"b":{
"u": 1,
"v": {
"x": 1,
"y": 2,
"z": 3,
"somevalue": {}
},
"w": 3
}
}
上述 SO 鏈接上的解決方案更改/創建如下值:
dataDict[mapList[-1]] = value
但是我們不能像dataDict[mapList[-1]].update()
那樣調用 dict 的更新函數。
檢查了所有 SO 和 Google,但沒有運氣。 有人可以為此提供一些幫助。 謝謝!
這應該適合你:
def set_item(this_dict, maplist, key, value):
for k in maplist:
if k not in this_dict:
this_dict[k] = {}
this_dict = this_dict[k]
this_dict[key] = value
dataDict = {
"a":{
"r": 1,
"s": 2,
"t": 3
},
"b":{
"u": 1,
"v": {
"x": 1,
"y": 2,
"z": 3
},
"w": 3
}
}
maplist = ["b", "v"]
new_key = "somevalue"
new_value = {}
set_item(dataDict, maplist, new_key, new_value)
print(dataDict)
輸出:
{'a': {'r': 1, 's': 2, 't': 3}, 'b': {'u': 1, 'v': {'x': 1, 'y': 2, 'z': 3, 'somevalue': {}}, 'w': 3}}
您可以使用setdefault()方法。
>>>dataDict['b']['v'].setdefault('something',{})
>>>print(dataDict)
{'a': {'r': 1, 's': 2, 't': 3},
'b': {'u': 1, 'v': {'x': 1, 'y': 2, 'z': 3, 'something': {}},
'w': 3}}
以上是它如何工作的想法。 為上述創建一個函數。
def set_new_key(d:dict,x:list,y:str):
for key in x:
d=d[key]
d.setdefault(y,{})
dataDict = {
"a":{
"r": 1,
"s": 2,
"t": 3
},
"b":{
"u": 1,
"v": {
"x": 1,
"y": 2,
"z": 3
},
"w": 3
}
}
mapList=['b','v']
set_new_key(dataDict,mapList,'something')
print(dataDict)
print()
set_new_key(dataDict,['a'],'another')
print(dataDict)
print()
set_new_key(dataDict,['b','v','something'],'inside something')
print(dataDict)
輸出:
{'a': {'r': 1, 's': 2, 't': 3}, 'b': {'u': 1, 'v': {'x': 1, 'y': 2, 'z': 3, 'something': {}}, 'w': 3}}
{'a': {'r': 1, 's': 2, 't': 3, 'another': {}}, 'b': {'u': 1, 'v': {'x': 1, 'y': 2, 'z': 3, 'something': {}}, 'w': 3}}
{'a': {'r': 1, 's': 2, 't': 3, 'another': {}}, 'b': {'u': 1, 'v': {'x': 1, 'y': 2, 'z': 3, 'something': {'inside something': {}}}, 'w': 3}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.