python之请求报文对比(假定最多二维字典)

两段请求报文,判断不一样的key和value,只判断d2里和d1不同的值,和全部不同的key

ok_req={    "version": "9.0.0",    "is_test": True,    "store": "",    "urs": "",    "device": {        "os": "android",        "imei": "99001062198893",        "device_id": "CQliMWEyYTEzNTYyYzk5MzJmCTJlNmY3Zjkx",        "mac": "02:00:00:00:00:00",        "galaxy_tag": "CQliMWEyYTEzNTYyYzk5MzJmCTJlNmY3Zjkx",        "udid": "a34b1f67dd5797df93fdd8b072f1fb8110fd0db6",        "network_status": "wifi"    },    "adunit": {        "category": "VIDEO",        "location": "1",        "app": "7A16FBB6",        "blacklist": ""    },    "ext_param":{       "is_start" : 0,       "vId":"VW0BRMTEV"    }}not_ok={   "version": "9.0.0",   "is_test": True,   "urs": "1",   "store": "",   "device": {      "os": "android",      "imei": "99001062298893",      "device_id": "CQliMWEyYTEzNTYyYzk5MzJmCTJlNmY3Zjkx",      "mac": "02:00:00:00:00:00",      "galaxy_tag": "CQliMWEyYTEzNTYyYzk5MzJmCTJlNmY3Zjkx",      "udid": "a34b1f67dd5797da93fdd8b072f1fb8110fd0db6",      "network_status": "wifi"   },   "adunit": {      "category": "VIDEO",      "location": "1",      "app": "7A16FBB6",      "blacklist": ""   },    "ext_param": {      "is_start": 0,      "vid": "VW0BRMTEV"   }}

方法一的需求分析:

  1. 循环d1的key,通过key去d2里取值,取不到的就是d2中不存在这个key,d2与d1里不一样的key

  2. 判断通过key取值的类型,如果是dict类型的继续循环

  3. 把d1和d2中的key转换成集合类型,取差集,取出的key即d1和d2中不一样的key

def compare(dic_1,dic_2):    for k in dic_1:        v1=dic_1.get(k)        v2=dic_2.get(k,‘get不到值‘)#通过k去d2里取值,d2里如果没有这个key,返回get不到值        if type(v1)==dict:            compare(v1,v2)#取值为dict类型递归        else:            if v1 != v2 and v2 !=‘get不到值‘ :                print (‘value不一样的:key是%s,v1是%s,v2是%s‘%(k,v1,v2))

r1 = set(dic_1.keys())    r2 = set(dic_2.keys())    res=r1.symmetric_difference(r2)    print(‘两个请求报文中不一样的key是:‘,‘,‘.join(res))

compare(ok_req,not_ok)

方法二的需求分析:

  1. 已知报文是二维,创建一个方法,把二维字典变成一维字典,key用特定的符号连接起来

  2. 循环d1的key,取d2里面取值,如果v1==v2,就在d2里把这个键值对删除,不同的话,说明key是d1里与d2里k-v不同的数据

  3. d2里剩下的全是和d1里k-v不同的数据,循环d2剩余的数据并输出

def buildDict(dict_0):#把报文的二维字典变成一维,二维字典的样式变成{一维字典key||二维key:value}    dict_t = {}    for key in dict_0:        value = dict_0.get(key)        if type(value) == dict:            for k,v in value.items():                dict_t[key+‘||‘+k]=v        else:            dict_t[key]=value    return dict_t

def compare(ok_req,not_ok):    dic_1 = buildDict(ok_req)#把ok_req报文变成一维的字典格式    dic_2 = buildDict(not_ok)#把not_ok报文变成一维的字典格式

for k in dic_1:        v1 = dic_1.get(k)        v2 = dic_2.get(k)        if v1==v2:            dic_2.pop(k)#把dict_2中key和value与dict_1中一样的删除        else:            print(‘dic_1中数据不同的k-v,是‘ + k+‘:‘+dic_1.get(k))

for k in dic_2:#dic_2中剩余的都是和dic_1中不一样的key        print(‘dic_2中不一样的k-v,是‘+k+‘:‘+dic_2.get(k))

compare(ok_req,not_ok)

原文地址:https://www.cnblogs.com/mpp0905/p/8280557.html

时间: 2024-10-12 20:02:57

python之请求报文对比(假定最多二维字典)的相关文章

python cookbook第三版学习笔记二:字典

一般来说字典中是一个键对应一个单值的映射,如果想一个键值映射多个值,那么就需要将这些值放到另外的容器中,比如列表或者集合. 比如d={'a':[1,2]} Collections中的defaultdict模块会自动创建这样的字典.如下 d=defaultdict(list) d['a'].append(1) d['a'].append(2) d['b'].append(3) defaultdict(<type 'list'>, {'a': [1, 2], 'b': [3]}) 下面再来看下字典

Django网站项目线下二维码扫描支付

1.前期工作 进行项目之前我们需要一个支付宝的沙箱环境,进入沙箱环境的网址:https://openhome.alipay.com/platform/appDaily.htm?tab=info 设置密钥的方式需要下载以支付宝生成密钥工具:工具包的地址及提取码: 链接:https://pan.baidu.com/s/1AXK3s4SBowNp1K47Qc1QHw 提取码:2u04 运行.exe文件 复制my_private_key.pem的内容,并且保证里面不含有空格和换行等字符:将复制的内容再填

二维码登陆

上一段时间研究微信公共账号,发现微信提供了一个扫码登陆验证的功能.近期头痛于经常忘记用户名密码,因此考虑是否可以结合这个功能,完成免密码登陆.百度后发现,有很多仁兄已经做过类似的功能了. 如这篇文章: 实现网站二维码扫描登录 仔细研究后,发现很多平台都提供了类似的功能,如百度.微博.OSChina等.因此考虑设计一款软件,将此项功能推广到其他平台和应用场景.毕竟可以方便像我这样的懒人.经过一番捣鼓后,初步版本已经基本完成了, 网站地址:http://it.maerdym.cn/mm_mishu/

二维码生成工厂

本次主要分享的是3个免费的二维码接口的对接代码和测试得出的注意点及区别,有更好处理方式多多交流,相互促进进步:最近在学习JavsScript的扩展TypeScript,感觉语法糖很甜,大部分与C#更为类似,可能都是微软项目的原因吧,有兴趣的朋友可以多多相互交流下: 以上是个人的看法,下面来正式分享今天的文章吧: . Google的Api二维码生成接口 . 2d-code的Api二维码生成接口 . topscan的Api二维码生成接口 . 使用面向对象+加载程序集创建对象合并以上接口封装成二维码生

基于SignalR的消息推送与二维码描登录实现

1 概要说明 使用微信扫描登录相信大家都不会陌生吧,二维码与手机结合产生了不同应用场景,基于二维码的应用更是比较广泛.为了满足ios.android客户端与web短信平台的结合,特开发了基于SinglarR消息推送机制的扫描登录.本系统涉及到以下知识点:     SignalR:http://signalr.net/ 这官网,ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当

Python 中的多维字典

Python中的dict可以实现迅速查找.那么有没有像数组有二维数组一样,有二维的字典呢?比如我需要对两个关键词进行查找的时候.2D dict 可以通过 dict_2d = {'a': {'a': 1, 'b': 3}, 'b': {'a': 6}} 来建立,并通过 dict_2d['a']['b'] 来访问.但是添加一个新的 “key-value”对却比较复杂.对一维字典,可以用 dict_1d = dict() dict_1d['a'] = 1 或者 dict_1d.update({'a':

二维码生成插件

(vue)二维码生成插件 一.vue-qr二维码插件(Image版) 1. 安装 // 使用node的npm安装 npm install vue-qr --save // 使用yarn安装 yarn add vue-qr 2. 引用项目 <VueQr draggable="false" :correctLevel="3" :dotScale="1" :logoSrc="logo" :margin="15&quo

python定义多维字典

在python中默认的dict方法定义多维字典较为复杂 并不能直接通过 a=dict() a['b']['c']['d'] = 1 >>> a['b']['c']['d']=1 Traceback (most recent call last):   File "<stdin>", line 1, in <module> KeyError: 'b' 如果想要创建多维字典,需要这样做 >>> a={} >>>

HTTP请求报文和响应报文

HTTP报文分为请求报文(request message)与响应报文(response message). 一.报文的组成部分 一个HTTP报文由3部分组成,分别是: (1).起始行(start line) (2).首部(header) (3).主体(body) 示例: HTTP/1.0 200 OK //起始行 Content-type:text/plain //首部 Content-length:19 //首部 Hi I'm a message! 主体 1.1 请求报文与响应报文的格式 请求