这是对SO以下问题的跟进:
通过键列表访问嵌套的字典项目?
上面链接中给出的所有解决方案都允许通过键列表替换/创建嵌套字典的值。但我的要求是将另一个字典附加到(更新(值。
如果我的字典如下:
dataDict = {
"a":{
"r": 1,
"s": 2,
"t": 3
},
"b":{
"u": 1,
"v": {
"x": 1,
"y": 2,
"z": 3
},
"w": 3
}
}
我的密钥列表如下:
maplist = ["b", "v"]
如何使用我的地图列表将另一个字典、"somevalue": {}
附加到dataDict['b']['v']
?
因此,在附加新的数据后,Dict 将如下所示:
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()
那样调用字典的更新函数。
检查了所有SO和谷歌,但没有运气。有人可以提供一些帮助吗?谢谢!
这应该适合您:
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}}