zoukankan      html  css  js  c++  java
  • python:如何判断字典a在字典b

    前言

    已知一个dict 比如a = {"a":1},另一个dict比如为b = {"a":1,"b":2},如何判断a是否在与b中。
    一般在接口测试的时候,返回的参数比较多的情况,如果一个个字段去校验,会比较麻烦,那么如何直接拿一个期望的字典放键值对,判断结果里面是否包含期望的值

    set实现

    set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
    set的issubset方法,a.issubset(b) :判断集合 a 的所有元素是否都包含在集合 b 中

    a = {"a": 1}
    b = {"a": 1, "b": 2}
    
    aa = set(a.items())
    print(aa)
    bb = set(b.items())
    print(bb)
    
    print(aa.issubset(bb))
    

    运行结果

    {('a', 1)}
    {('a', 1), ('b', 2)}
    True
    

    自定义判断方法

    上面方法看似没什么毛病,但是这里会存在一个问题,因为set是一个无序且不重复的元素集合。元素为不可变对象!
    于是我们把a的值换成一个可变对象,如list 或 dict,问题就来了

    a = {"a": [1, 2]}
    b = {"a": [1, 2], "b": 2}
    
    aa = set(a.items())
    

    再次执行的时候就会报错

    Traceback (most recent call last):
      File "D:/demo/b.py", line 4, in <module>
        aa = set(a.items())
    TypeError: unhashable type: 'list'
    

    a的值换成一个dict类型,也是会报错TypeError: unhashable type: 'dict'

    a = {"a": {"c": 3}}
    b = {"a": {"c": 3}, "b": 2}
    
    aa = set(a.items())
    

    于是可以自己写个函数遍历去判断

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    def dict_a_in_b(dict_a, dict_b):
        '''is dict_a in dict_b, return True/False'''
        result = None
        for key in dict_a:
            if (key in dict_b) and (dict_a[key] == dict_b[key]):
                result = True
            else:
                return False
        return result
    
    if __name__ == '__main__':
        a = {"a": {"c": 3}}
        b = {"a": {"c": 3}, "b": 2}
        print(dict_a_in_b(a, b))
    

    实际应用

    一般在接口测试的时候,返回的参数比较多的情况,如果一个个字段去校验,会比较麻烦,那么如何直接拿一个期望的字典放键值对,判断结果里面是否包含期望的值
    当请求一个接口的时候,返回的内容如下

    {
        'code': 0,
        'msg': 'success!',
        'data': [{"username": "yoyo", "qq": "283340479"}]
    }
    

    期望结果里面包含 {'code': 0, 'msg': 'success!'}

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    def dict_a_in_b(dict_a, dict_b):
        '''is dict_a in dict_b, return True/False'''
        result = None
        for key in dict_a:
            if (key in dict_b) and (dict_a[key] == dict_b[key]):
                result = True
            else:
                return False
        return result
    
    # 预期结果
    expected = {'code': 0, 'msg': 'success!'}
    # 实际结果
    actual_result = {
        'code': 0,
        'msg': 'success!',
        'data': [{"username": "yoyo", "qq": "283340479"}]
    }
    
    
    if __name__ == '__main__':
        print(dict_a_in_b(expected, actual_result))
    

      

    原文:https://www.cnblogs.com/yoyoketang/p/13717522.html

  • 相关阅读:
    3D游戏常用技巧Normal Mapping (法线贴图)原理解析——高级篇
    [工作积累] OpenGL ES3.0: glInvalidateFramebuffer
    引擎设计跟踪(九.14.2c) 最近一些小的更新
    引擎设计跟踪(九.14.2b) 骨骼动画基本完成
    最近在玩的游戏
    引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复
    [工作积累] Google/Amazon平台的各种坑
    [工作积累] NDK通过Java获取package name 和version
    [工作记录] Android OpenSL ES: references & AAC related
    [工作记录] Android OpenGL ES: non-square texture
  • 原文地址:https://www.cnblogs.com/sucretan2010/p/14847499.html
Copyright © 2011-2022 走看看