【问题标题】:Merging Python nested dictionaries with mergeable keys on different levels将 Python 嵌套字典与不同级别的可合并键合并
【发布时间】:2018-09-14 08:35:52
【问题描述】:

我搜索了这个问题的解决方案一段时间,但所有解决方案都假定可连接键位于字典的同一嵌套级别。

简而言之,有这两个字典:

dict1 = {'Head': 
            {'Face': 
                {'Eyes': 
                    {'Eyebrows': {}, 
                     'Eyelids': 
                        {'Eyelashes': {}
                        }
                    }, 
                 'Nose': {}, 
                 'Mouth': {}
                }
            }
        }
dict2 = {'Eyes': 
            {'Eyebrows': {}, 
             'Eyelids': 
                {'Eyelashes': {}
                }
            }
        }

我想要以下:

dict3 = {'Head': 
            {'Face': 
                {'Eyes': 
                    {'Eyebrows': {}, 
                     'Eyelids': 
                        {'Eyelashes': {}
                        }
                    },         
                 'Nose': {}, 
                 'Mouth': {}
                }
            }
        }

如你所见,关键“眼睛”应该是这个小例子中的合并点,它在 dict1 中树的第三级和 dict2 中的第一级。字典可能对所有键/值都有重叠(在不同级别,例如在“眼睛”的情况下),或者根本没有重叠,但我也需要避免重复。

关键是,我会发现其中一个字典已经包含在另一个字典中,或者它们根本不会重叠。我正在尝试“修剪”一棵仅保留基于术语搜索(纯字符串搜索)的某些节点的巨型树。问题是一些节点(以及派生的、更深的节点)可能包括其他一些节点,但有时它们可​​能根本不重合。把它想象成你身体的树/嵌套字典。您可以搜索“细胞”,找到一个名为“血细胞”的大节点,其中包括“凝血细胞”、“运输细胞”或“保护细胞”等其他节点。此外,例如,在主树的另一个分支中,您可能会找到“骨细胞”。所有这些都将在搜索中被检索到,其中一些可能包括其他(“凝血”、“运输”或“保护”将在“血细胞”内),但其他一些可能与该树分开(“骨细胞” )。我希望它们位于同一个全局嵌套树中。

在这种情况下如何合并多个字典?提前致谢!

【问题讨论】:

  • dict1dict3 之间没有前后差异 - 这使它成为一个不太好的例子。你试图合并你的数据(How to create a Minimal, Complete, and Verifiable example)是什么?另外:请提供真实数据。
  • @PatrickArtner 你是对的,这不是一个很好的例子,实际上我在写这个问题时遇到了一些麻烦,这很棘手。我更新了我的帖子,大致了解了我想要做什么,也许这比专注于示例更容易理解。

标签: python dictionary merge nested


【解决方案1】:

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

找到关卡,然后执行字典合并。

【讨论】:

    【解决方案2】:

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

    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": {}
         }
      }
    }
    

    【讨论】:

    • 谢谢,看起来不错!
    猜你喜欢
    • 2011-05-13
    • 2022-01-19
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2012-09-20
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多