我如何循环通过嵌套字典(从json),并检查键是否在另一个嵌套字典(从json),并添加如果不是? &



我有两个嵌套的字典(从json加载),需要检查一个中的键是否已经存在于另一个中,如果没有添加它们。

示例json:

eg_dict = {
"A":
{
"A1":
{
"A1a": "bird",
"A1b": true,
"A1c": false
},
"A2":
{
"A2a":
{
"A2a1": "parrot",
"A2a2":
{
"enabled": true
}
}
}
},
"B":
{
"B1":
{
"B1a": "Reptile"
},
"A2":
{
"A2a":
{
"A2a2":
{
"enabled": true
}
}
}
}
}

我需要把A1和A2a1加到b中

我已经尝试检查一个嵌套字典是否是另一个嵌套字典的子集,但它没有做我需要的。

我开始尝试通过递归函数传递父键,但由于我不知道嵌套有多深,这似乎是一个死胡同?

def get_all_values(pkey, nested_dictionary):
#I don't think passing p(arent)key to the function gets me anywhere
for key, value in nested_dictionary.items():
if type(value) is dict:
print(key, ":", value)
get_all_values(pkey, value)
else:
print(key, ":", value)

def get_json(file, chartname):
#print(chartname)
with open(file) as file:
file= json.load(file)
b = file['B']
#Can do it if I know the key I want to copy
if 'A1' in file['A'].keys():
b['A1'] = file['A']['A1']
#Trying a function to get all missing keys from A
get_all_values(key=None, file['B'])
b = json.dumps(b)
return b

第一次张贴在stackoverflow,所以帮助改进我的问题也欢迎!

AB构建字典的递归解,其中A的值优先于B的值:

a_dict = eg_dict['A']
b_dict = eg_dict['B']
print(a_dict)
# {'A1': {'A1a': 'bird', 'A1b': True, 'A1c': False}, 'A2': {'A2a': {'A2a1': 'parrot', 'A2a2': {'enabled': True}}}}
print(b_dict)
# {'B1': {'B1a': 'Reptile'}, 'A2': {'A2a': {'A2a2': {'enabled': True}}}}
def extend_dict(primary_dict, secondary_dict):
result_dict = {}
for k in set(primary_dict.keys()).union(set(secondary_dict.keys())):
if (k in primary_dict.keys() and k in secondary_dict.keys()) and (isinstance(primary_dict[k], dict) and isinstance(secondary_dict[k], dict)):
result_dict.update({k: extend_dict(primary_dict[k], secondary_dict[k])})
elif k in primary_dict.keys():
result_dict.update({k: primary_dict[k]})
elif k in secondary_dict.keys():
result_dict.update({k: secondary_dict[k]})
return result_dict
extended = extend_dict(a_dict, b_dict) 
print(extended)
# {'B1': {'B1a': 'Reptile'}, 'A2': {'A2a': {'A2a2': {'enabled': True}, 'A2a1': 'parrot'}}, 'A1': {'A1a': 'bird', 'A1b': True, 'A1c': False}}

如果要切换优先级,只需切换AB,这样extended = extend_dict(b_dict, a_dict).

让我知道这是你正在寻找的。

最新更新