Python:创建嵌套字典,使用存储在列表中的键

Python: Creating nested dictionaries, using keys stored in a list

编辑:

我忘了提到还有其他词典和列表,到目前为止建议的解决方案对我的示例非常有效,但如果我想使用不同的 paths/lists.[=18 添加更多词典则不行=]

例如:

d1 = {"firstKey":"Value_1"}
d2 = {"secondKey":"Value_2"}
d3 = {"thirdKey":"Value_3"}

p1 = ["level_1a", "level_1b", "level_1c"]
p2 = ["level_1a", "level_1d", "level_1e"]
p2 = ["level_2a", "level_2b"]

我需要 add/merge 同一个“主”词典中的所有 3 个词典 d1、d2、d3(最终更多),嵌套在 p1、p2 和 p3 中列出的所有键下。请注意,如果共享密钥(例如“level_1a”),则需要使用现有密钥,而不是创建新密钥。

最终从三个列表中得到的字典(更多的最终,这只是一个例子)应该是这样的:

{
    "level_1a":{
        "level_1b":{"level_1c":{"firstKey":"Value_1"}},
        "level_1d":{"level_1e":{"secondKey":"Value_2"}}
    },
    "level_2a":
        {"level_2b":{"thirdKey":"Value_3"}}
}

原版POST:

我有一个简单的字典,我需要将它嵌套在另一个字典的深处,并且键存储在一个列表中(以相反的顺序)。

我的基本字典是这样的:{"firstKey":"Value_1"}

键列表如下所示:["level_1a", "level_1b", "level_1c"]

这是我要生成的结果:

{
 "level_1a":{
        "level_1b":{
               "level_1c":
                          {"firstKey":"Value_1"}
                   }
            }
}

这是我试过的代码,我的循环似乎一直在添加元素而不是替换它们...

masterDict = {}

d1 = {"firstKey":"Value_1"}
p1 = ["level_1a", "level_1b", "level_1c"]
tempDict = d1.copy()

for level in reversed(p1):
    print(level)
    tempDict[level] = tempDict
    print(f'TempDict = {tempDict}')
    print('-=-=-=-')

这是我的代码输出:

level_1c
TempDict = {'firstKey': 'Value_1', 'level_1c': {...}}
-=-=-=-
level_1b
TempDict = {'firstKey': 'Value_1', 'level_1c': {...}, 'level_1b': {...}}
-=-=-=-
level_1a
TempDict = {'firstKey': 'Value_1', 'level_1c': {...}, 'level_1b': {...}, 'level_1a': {...}}
-=-=-=-

有没有办法使用列表中的键将简单字典嵌套一次(并且之前的字典成为键的新值)?

非常感谢!

一种选择是递归地使用dict.setdefault

def build_nested(ps, ds, d_out={}):

    def nested(p, d_in, d_out):
        if len(p)==1:
            d_out[p[0]] = d_in
        else:
            nested(p[1:], d_in, d_out.setdefault(p[0], {}))

    for p, d in zip(ps, ds):
        nested(p, d, d_out)
       
    return d_out

tmp = build_nested([p1,p3], [d1,d3])
out = build_nested([p2],[d2], tmp)

输出:

{'level_1a': {'level_1b': {'level_1c': {'firstKey': 'Value_1'}},
  'level_1d': {'level_1e': {'secondKey': 'Value_2'}}},
 'level_2a': {'level_2b': {'thirdKey': 'Value_3'}}}

这可以使用占位符变量和循环来完成。然后用字典更新占位符:

current = master_dict = {}
data = {"firstKey":"Value_1"}
keys = ["level_1a", "level_1b", "level_1c"]

for key in keys:
    current[key] = current = {}
current.update(data)

>>> master_dict
{'level_1a': {'level_1b': {'level_1c': {'firstKey': 'Value_1'}}}}