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

时间:2019-12-30 16:06:05

标签: python dictionary

这是关于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,但没有运气。有人可以为此提供一些帮助。谢谢!

2 个答案:

答案 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}}