python有没有一种好的方法来比较深度未知的复杂字典&

2024-06-01 11:51:34 发布

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

我有两个dictionary对象,它们非常复杂,是通过将大型xml文件转换为python字典创建的。你知道吗

我不知道字典的深度,只想比较一下,想要下面的输出。。。你知道吗

我的字典是这样的

d1 = {"great grand father":
         {"name":"John",
          "grand father":
             {"name":"Tom",
              "father":
                 {"name":"Andy",
                  "Me":
                     {"name":"Mike",
                      "son": 
                         {"name":"Tom"}
                     }
                 }
             }
         }
     }

d2也是一个类似的字段,但可能有任何一个字段丢失或更改如下

d2 = {"great grand father":
         {"name":"John",
          "grand father":
             {"name":"Tom",
              "father":
                 {"name":"Andy",
                  "Me":
                     {"name":"Tonny",
                      "son": 
                         {"name":"Tom"}
                     }
                 }
             }
         }
     }

字典比对结果应该是这样的-

Expected Key/Val : Me->name/"Mike" 
Actual Key/Val : Me->name/"Tonny"

如果键“name”不存在于d2中的“Me”中,它应该提供以下输出

Expected Key/Val : Me->name/"Mike" 
Actual Key/Val : Me->name/NOT_FOUND

我重复一遍,字典深度可以是可变的,也可以是动态生成的。这里的两本词典是作为例子。。。你知道吗

我在SO中看到的所有词典比较问题及其答案都是相关的固定深度词典。。。。。你知道吗


Tags: keyname字典valjohnd2memike
2条回答

在这里我找到了一种比较任何两本字典的方法-

我试过各种不同深度的词典,为我工作过。代码不是那么模块化,只是供参考-

import pprint

pp = pprint.PrettyPrinter(indent=4)

dict1 = { 'Person' : { 'Male' : {'Boys' : {'Roger' : {'age' : 20},
                                           'Rafa' : {'age' : 25}
                                          }
                                },
                       'Female' : { 'Girls' : {'Serena' : {'age' : 23},
                                               'Maria' : {'age' : 15}
                                              }
                                  }

                     },
          'Animal' : { 'Huge' : {'Elephant' : {'color' : 'black' }
                                }
                     }
        }
'''
dict2 = { 'Person' : { 'Male' : {'Boys' : {'Roger' : {'age' : 20}
                                          }
                                },
                       'Female' : { 'Girls' : {'Serena' : {'age' : 23},
                                               'Maria' : {'age' : 1}
                                              }
                                  }
                     }
        }

dict2 = { 'Person' : { 'Male' : {'Boys' : {'Roger' : {'age' : 20},
                                           'Rafa' : {'age' : 2}
                                          }
                                }
                     }
        }
'''

dict2 = { 'Person' : { 'Male' : {'Boys' : {'Roger' : {'age' : 2}}},
                       'Female' : 'Serena'}
        }


key_list = []
err_list = {}
def comp(exp,act):
    for key in exp:
        key_list.append(key)
        exp_val = exp[key]
        try:
            act_val = act[key]
            is_dict_exp = isinstance(exp_val,__builtins__.dict)
            is_dict_act = isinstance(act_val,__builtins__.dict)

            if is_dict_exp == is_dict_act == True:
                comp(exp_val,act_val)
            elif is_dict_exp == is_dict_act == False:
                if not exp_val == act_val:
                    temp = {"Exp" : exp_val,"Act" : act_val}
                    err_key = " >".join(key_list)
                    if err_list.has_key(key):
                        err_list[err_key].update(temp)
                    else:
                        err_list.update({err_key : temp})
            else:
                temp = {"Exp" : exp_val, "Act" : act_val}
                err_key = " >".join(key_list)
                if err_list.has_key(key):
                    err_list[err_key].update(temp)
                else:
                    err_list.update({err_key : temp})

        except KeyError:
            temp = {"Exp" : exp_val,"Act" : "NOT_FOUND"}
            err_key = " >".join(key_list)
            if err_list.has_key(key):
                err_list[err_key].update(temp)
            else:
                err_list.update({err_key : temp})
        key_list.pop()

comp(dict1,dict2)

pp.pprint(err_list)

这是我的代码输出-

{   'Animal': {   'Act': 'NOT_FOUND',
                  'Exp': {   'Huge': {   'Elephant': {   'color': 'black'}}}},
    'Person >Female': {   'Act': 'Serena',
                           'Exp': {   'Girls': {   'Maria': {   'age': 15},
                                                   'Serena': {   'age': 23}}}},
    'Person >Male >Boys >Rafa': {   'Act': 'NOT_FOUND', 'Exp': {   'age': 25}},
    'Person >Male >Boys >Roger >age': {   'Act': 2, 'Exp': 20}
}

还可以尝试使用注释代码中给出的其他词典。。你知道吗

还有一件事-在期望的字典中检查密钥,并将其与实际的匹配。如果我们以交替的顺序传递字典,另一种方式匹配也是可能的。。。你知道吗

comp(dict2,dict1)

你真走运,我是作为我工作的项目的一部分做的。你知道吗

您需要一个递归函数,例如:

def checkDifferences(dict_a,dict_b,differences=[])

您可以先检查其中一个中不存在的密钥。 e、 克

Expected Name/Tom Actual None

然后比较值的类型,即检查值是dict还是list等

如果是,则可以使用dict\ u a/b值递归调用函数。递归调用时,传递differences数组。你知道吗

如果值的类型是列表,并且列表中可能包含字典,那么需要将列表转换为dict并调用转换后的字典上的函数。你知道吗

很抱歉,我不能帮更多,但我已经没有访问源代码。希望这足以让你开始。你知道吗

相关问题 更多 >