我花了一段时间寻找这个问题的解决方案,但所有的解决方案都假设可接合的键位于字典的同一嵌套级别。
长话短说,有这两句话:
dict1 = {'Head':
{'Face':
{'Eyes':
{'Eyebrows': {},
'Eyelids':
{'Eyelashes': {}
}
},
'Nose': {},
'Mouth': {}
}
}
}
dict2 = {'Eyes':
{'Eyebrows': {},
'Eyelids':
{'Eyelashes': {}
}
}
}我想要以下内容:
dict3 = {'Head':
{'Face':
{'Eyes':
{'Eyebrows': {},
'Eyelids':
{'Eyelashes': {}
}
},
'Nose': {},
'Mouth': {}
}
}
}如您所见,关键的"Eyes“应该是这个小示例中的合并点,它在dict1中位于树的第三层,在dict2中位于第一层。对于所有的键/值,字典可能会有重叠(在不同的级别,就像'Eyes‘的例子),或者根本没有重叠,但我也需要避免重复。
重点是,我会发现要么一个字典已经包含在另一个字典中,要么它们根本不会重叠。我试图“修剪”一棵巨型树,只保留基于词条搜索(纯字符串搜索)的特定节点。问题是,一些节点(以及派生的、更深的节点)可能包括其他一些节点,但有时它们可能根本不重合。把它想象成你身体的一个树/嵌套字典。你可以搜索"cell",找到一个叫做“血细胞”的大节点,它包括其他节点,如“凝血细胞”、“运输细胞”或“保护细胞”。此外,在主树的另一个分支中,例如,您可能会找到“骨细胞”。所有这些都将在搜索中检索到,其中一些可能包括其他(“凝血”、“运输”或“保护”将在“血细胞”内),但其他一些可能与该树(“骨细胞”)分离。我希望它们位于相同的全局嵌套树中。
在这种情况下,我如何合并几个字典?提前感谢!
发布于 2018-09-14 16:43:31
如果您不知道它们相交的级别,则必须执行类似深度优先搜索树的操作,以确认字典2不在字典1中,然后将它们都添加到最高级别。
找到级别,然后执行字典合并。
发布于 2018-09-14 22:13:23
您可以使用一个简单的递归函数来更新您的字典(节点:我在您输入的空字典中添加了键值对,以反映以下代码所做的实际更改):
d = {'Head': {'Face': {'Eyes': {'Eyebrows': {}, 'Eyelids': {'Eyelashes': {}}}, 'Nose': {}, 'Mouth': {}}}}
dict2 = {'Eyes':
{'Eyebrows': {"color":'brown'},
'Eyelids':
{'Eyelashes': {"type":"long", "color":"black"}
}
}
}
def update_dict(d, update_with):
if not any(i in update_with for i in d):
return {a:update_dict(b, update_with) if isinstance(b, dict) else b for a, b in d.items()}
return {a:update_dict(b, update_with if a not in update_with else update_with[a]) if isinstance(b, dict) and b \
else update_with.get(a, b) for a, b in d.items()}import json
print(json.dumps(update_dict(d, dict2), indent=4))输出:
{
"Head": {
"Face": {
"Eyes": {
"Eyebrows": {
"color": "brown"
},
"Eyelids": {
"Eyelashes": {
"type": "long",
"color": "black"
}
}
},
"Nose": {},
"Mouth": {}
}
}
}https://stackoverflow.com/questions/52328018
复制相似问题