两段请求报文,判断不一样的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)

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

  1. python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)

    昨日内容回顾 1.app播放音乐 plus.audio.createPlayer(文件路径/URL) player.play() 播放音乐 player.pause() 暂停播放 player.res ...

  2. Python算法之动态规划(Dynamic Programming)解析:二维矩阵中的醉汉(魔改版leetcode出界的路径数)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_168 现在很多互联网企业学聪明了,知道应聘者有目的性的刷Leetcode原题,用来应付算法题面试,所以开始对这些题进行" ...

  3. Python输入数组(一维数组、二维数组)

    一维数组: arr = input("") //输入一个一维数组,每个数之间使空格隔开 num = [int(n) for n in arr.split()] //将输入每个数以空 ...

  4. 【转】python中的一维卷积conv1d和二维卷积conv2d

    转自:https://blog.csdn.net/qq_26552071/article/details/81178932 二维卷积conv2d 给定4维的输入张量和滤波器张量来进行2维的卷积计算.即 ...

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

    一般来说字典中是一个键对应一个单值的映射,如果想一个键值映射多个值,那么就需要将这些值放到另外的容器中,比如列表或者集合. 比如d={'a':[1,2]} Collections中的defaultdi ...

  6. Python数组操作将一维数组变成二维数组

    一.问题 我们在进行数组操作的时候会遇到将一个低维的数组变成一个高维的素数组 二.解决 第一种方法基本思路就是将低维数组进行等长的循环,在第一次为零的情况下,需要添加一个[]数组,原因是将它的基本框架 ...

  7. [Python模块学习]用qrcode模块生成二维码

    转自:https://blog.csdn.net/jy692405180/article/details/65937077

  8. Python二维数组构造

    周末用python要写个算法用到来二维数组, 一时间还不知道python怎么构造多维数组出来.看到一段不错的代码, 记录一下. Python使用list嵌套实现多维数组, PHP可以使用array嵌套 ...

  9. Python实现微信扫码支付模式二(NativePay)

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7649207.html 核心代码github地址:https://github.com/ygj0930/Pyth ...

随机推荐

  1. VUE 之 vuex 和 axios

    1.Vuex 部分 1.1 Vuex 是专门为vue.js设计的集中式状态管理架构,其实就是将数据存在一个store中,共各个组件共享使用 1.2 配置: 1.2.1 下载:--npm install ...

  2. Writing a Simple YARN Application 从hadoop生态抽出yarn ,单独使用yarn

    Apache Hadoop 2.9.1 – Hadoop: Writing YARN Applications https://hadoop.apache.org/docs/current/hadoo ...

  3. Hadoop spark mongo复制集

    启动hadoop cd /usr/local/hadoop/hadoop $hadoop namenode -format # 启动前格式化namenode $./sbin/start-all.sh ...

  4. nodejs 实战

    使用 Koa + MongoDB + Redis 搭建论坛系统 「新手向」koa2从起步到填坑 基于koa2和react的PC端脚手架 一键生成koa/koa2项目: nodejs原生,express ...

  5. nodejs api 中文文档

    文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...

  6. java 开发面试题小整理(二)

    51.Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口? 答:可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和 ...

  7. java多线程实现简单队列

    1.创建Queue.java public class Queue { private LinkedList<Object> list = new LinkedList<Object ...

  8. 让th里面的东西自动换行

    让th里面的东西自动换行 html中的TH里面的文字不管多长,始终是一行,很烦 <th style="word-wrap:break-word;">aaaaaaaaaa ...

  9. [Silverlight 2.0 控制物体绕圆弧运行(C#初探篇)]

    我自己写的第一个 Silverlight 2.0 程序    [Silverlight 2.0 控制物体绕圆弧运行(C#初探篇)]            程序运行时:小地球将绕着圆形轨迹做圆周运动. ...

  10. 2016-5-23 jsp

    1.table的边框:rules这个参数,它有三个值(cols,rows,none),当rules=cols时,表格会隐藏横向的分隔线,也就是我们只能看到表格的列:当rules=rows时,就隐藏了纵 ...