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'}}}}
编辑:
我忘了提到还有其他词典和列表,到目前为止建议的解决方案对我的示例非常有效,但如果我想使用不同的 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'}}}}