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