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

枫铃4年前 (2021-06-26)Python274

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,...

爬虫基本原理

爬虫基本原理 一、爬虫是什么? 百度百科和维基百科对网络爬虫的定义:简单来说爬虫就是抓取目标网站内容的工具,一般是根据定义的行...

Django 函数和方法的区别

函数和方法的区别 1、函数要手动传self,方法不用传 2、如果是一个函数,用类名去调用,如果是一个方法...

Django 知识补漏单例模式

单例模式:(说白了就是)创建一个类的实例。在 Python 中,我们可以用多种方法来实现单例模式&#x...

Django基础知识MTV

Django简介 Django是使用Python编写的一个开源Web框架。可以用它来快速搭建一个高性能的网站。 Django也是一个MVC框架。但是在Dj...

Python mysql 索引原理与慢查询优化

一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。