ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-08-11 20:03:33  阅读:183  来源: 互联网

标签:f1 f2 遍历 递归 python dict main d2 d1


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

 

标签:f1,f2,遍历,递归,python,dict,main,d2,d1
来源: https://www.cnblogs.com/JcHome/p/16577651.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有