簡體   English   中英

通過鍵列表附加(不替換)嵌套字典中的項目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM