python 用递归方式遍历字典并进行断言

python 递归遍历字典并进行断言

在进行子字典 是否包含在 主字典中的断言时,常规的断言方式不太准确,特别是在嵌套字典或列表时,就判断不出理想的效果,在百度好久之后,发现好多人后是先将字典转换成集合,然后在通过子集合是否包含在主集合的形式。因为没有尝试过不知道,是否能校验到字典中包含列表的情况。后面实在没办法就自己用递归的方式,封装一个方法进行断言。仅供参考:

子字典:

a={"f1":2}

主字典:

b={"b":1,"c":{"a":1},"a":[] ,"a2":[],"a1":{}, "d":[{"c":1,"c1":2},{"d1":1,"d2":2,"f":{"f1":2,"f2":3}}]}

实现代码如下:

def AssertDict(sub_dict,main_dict):
    """
    @sub_dict  子字典
    @main_dict 主字典
    """
    print(main_dict)
    for sub_key,sub_value in sub_dict.items():
        for main_key,main_value in main_dict.items():
            if(sub_key == main_key):
                if(sub_dict[sub_key] == main_dict[main_key]):
                    return True
            elif(isinstance(main_dict[main_key],dict) and len(main_dict[main_key])>0):
                tmp = main_dict[main_key]
                del main_dict[main_key]
                main_dict.update(tmp)
                return AssertDict(sub_dict,main_dict)
        
            elif(isinstance(main_dict[main_key],list) and len(main_dict[main_key])>0):
                for list_dict in main_dict[main_key]:
                    main_dict.update(list_dict)
                del main_dict[main_key]
                return AssertDict(sub_dict,main_dict)
            else:
                del main_dict[main_key]
                return AssertDict(sub_dict,main_dict)
        
val = AssertDict(a,b)
print(val)

运行结果-便于查看特地打印主字典的变化过程,如下

PS E:\newDjango> & D:/tools/python3/python.exe e:/newDjango/testCode/test2.py
{'b': 1, 'c': {'a': 1}, 'a': [], 'a2': [], 'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'c': {'a': 1}, 'a': [], 'a2': [], 'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'a': 1, 'a2': [], 'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'a2': [], 'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'d': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'c': 1, 'c1': 2, 'd1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}
{'c1': 2, 'd1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}
{'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}
{'d2': 2, 'f': {'f1': 2, 'f2': 3}}
{'f': {'f1': 2, 'f2': 3}}
{'f1': 2, 'f2': 3}
True

断言失败的运行结果,如下:

将字典a的值改为:a={"f1":21}

当前运行失败,返回的结果是:None

PS E:\newDjango> & D:/tools/python3/python.exe e:/newDjango/testCode/test2.py
{'b': 1, 'c': {'a': 1}, 'a': [], 'a2': [], 'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'c': {'a': 1}, 'a': [], 'a2': [], 'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'a': 1, 'a2': [], 'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'a2': [], 'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'a1': {}, 'd': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'d': [{'c': 1, 'c1': 2}, {'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}]}
{'c': 1, 'c1': 2, 'd1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}
{'c1': 2, 'd1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}
{'d1': 1, 'd2': 2, 'f': {'f1': 2, 'f2': 3}}
{'d2': 2, 'f': {'f1': 2, 'f2': 3}}
{'f': {'f1': 2, 'f2': 3}}
{'f1': 2, 'f2': 3}
{'f1': 2}
None

 

posted @ 2022-08-11 19:45  西夏一品唐  阅读(604)  评论(0编辑  收藏  举报