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
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/279960.html