这是关于SO的以下问题的后续措施:
Access nested dictionary items 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"]
如何使用我的地图列表在"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()
之类的字典更新函数。
检查了所有SO和Google,但没有运气。有人可以为此提供一些帮助。谢谢!
答案 0 :(得分:3)
这应该对您有用:
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}}
答案 1 :(得分:2)
您可以使用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}}