通过键列表在嵌套字典中追加(而不是替换)项目



这是对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}}

最新更新