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



编辑

我忘了提到还有其他字典和列表,到目前为止建议的解决方案对我的示例非常有效,但如果我想使用不同的路径/列表添加更多的字典,就不行了。

例如:

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"]

我需要将所有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"}}
}

原始帖子

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

我的基本字典如下:{"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'}}}

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

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'}}}}

相关内容

  • 没有找到相关文章

最新更新