首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并具有不同级别的可合并键的Python嵌套字典

合并具有不同级别的可合并键的Python嵌套字典
EN

Stack Overflow用户
提问于 2018-09-14 16:35:53
回答 2查看 101关注 0票数 0

我花了一段时间寻找这个问题的解决方案,但所有的解决方案都假设可接合的键位于字典的同一嵌套级别。

长话短说,有这两句话:

代码语言:javascript
复制
dict1 = {'Head': 
            {'Face': 
                {'Eyes': 
                    {'Eyebrows': {}, 
                     'Eyelids': 
                        {'Eyelashes': {}
                        }
                    }, 
                 'Nose': {}, 
                 'Mouth': {}
                }
            }
        }
dict2 = {'Eyes': 
            {'Eyebrows': {}, 
             'Eyelids': 
                {'Eyelashes': {}
                }
            }
        }

我想要以下内容:

代码语言:javascript
复制
dict3 = {'Head': 
            {'Face': 
                {'Eyes': 
                    {'Eyebrows': {}, 
                     'Eyelids': 
                        {'Eyelashes': {}
                        }
                    },         
                 'Nose': {}, 
                 'Mouth': {}
                }
            }
        }

如您所见,关键的"Eyes“应该是这个小示例中的合并点,它在dict1中位于树的第三层,在dict2中位于第一层。对于所有的键/值,字典可能会有重叠(在不同的级别,就像'Eyes‘的例子),或者根本没有重叠,但我也需要避免重复。

重点是,我会发现要么一个字典已经包含在另一个字典中,要么它们根本不会重叠。我试图“修剪”一棵巨型树,只保留基于词条搜索(纯字符串搜索)的特定节点。问题是,一些节点(以及派生的、更深的节点)可能包括其他一些节点,但有时它们可能根本不重合。把它想象成你身体的一个树/嵌套字典。你可以搜索"cell",找到一个叫做“血细胞”的大节点,它包括其他节点,如“凝血细胞”、“运输细胞”或“保护细胞”。此外,在主树的另一个分支中,例如,您可能会找到“骨细胞”。所有这些都将在搜索中检索到,其中一些可能包括其他(“凝血”、“运输”或“保护”将在“血细胞”内),但其他一些可能与该树(“骨细胞”)分离。我希望它们位于相同的全局嵌套树中。

在这种情况下,我如何合并几个字典?提前感谢!

EN

回答 2

Stack Overflow用户

发布于 2018-09-14 16:43:31

如果您不知道它们相交的级别,则必须执行类似深度优先搜索树的操作,以确认字典2不在字典1中,然后将它们都添加到最高级别。

找到级别,然后执行字典合并。

票数 0
EN

Stack Overflow用户

发布于 2018-09-14 22:13:23

您可以使用一个简单的递归函数来更新您的字典(节点:我在您输入的空字典中添加了键值对,以反映以下代码所做的实际更改):

代码语言:javascript
复制
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()}

代码语言:javascript
复制
import json
print(json.dumps(update_dict(d, dict2), indent=4))

输出:

代码语言:javascript
复制
{
"Head": {
    "Face": {
        "Eyes": {
            "Eyebrows": {
                "color": "brown"
            },
            "Eyelids": {
                "Eyelashes": {
                    "type": "long",
                    "color": "black"
                }
             }
         },
         "Nose": {},
         "Mouth": {}
     }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52328018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档