将Python嵌套字典与不同级别的可合并键合并

2024-06-16 11:20:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

简而言之,有两条格言:

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中位于树的第一层。字典可能对所有键/值都有重叠(在不同的级别,比如在'Eyes'案例中),或者根本没有重叠,但是我也需要避免重复。你知道吗

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

在这种情况下,如何合并几本词典?提前谢谢!你知道吗


Tags: 字典节点级别headnose词典细胞face
2条回答

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

找到级别,然后执行字典合并。你知道吗

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

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

相关问题 更多 >