python字典对比

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python字典对比相关的知识,希望对你有一定的参考价值。

我有两个字典
tulp1 = 'test_two': '124', 'test_four': '185','test_one': '196', 'test_three': '26', 'test_five': '489'
tulp2 = 'test_two': '124', 'test_one': '196', 'test_three': '26'
我现在需要比较两字典
①当key相同时比较value,如果value不相同返回对应的key
②当①中的方法实现后我需要检查两字典中是否存在不同的元素,如果存在返回该元素的key

tulp1 = 'test_two': '124', 'test_four': '185','test_one': '196', 'test_three': '26', 'test_five': '489'
tulp2 = 'test_two': '124', 'test_one': '196', 'test_three': '26'

for i in tulp2:
for j in tulp1:
if i == j:
if tulp1[i] == tulp2[j]:
print i, tulp1[i], ":the same"
else:
break

dif = set(tulp1.items())^set(tulp2.items())
print dif

看到你提的是两个不同的要求,所以我也分了两步来完成,第一个for循环是检查是否有相同的key,并比较value。
第二个是用了一个方法直接得出了不同元素的key和value。
参考技术A # 我把tulp1中的test_one的值改成195了, 为了结果不为空

tulp1 = 'test_two': '124', 'test_four': '185','test_one': '195', 'test_three': '26', 'test_five': '489'
tulp2 = 'test_two': '124', 'test_one': '196', 'test_three': '26'

①的解法:
set(tulp1) & set(tulp2) - set(dict(set(tulp1.items()) & set(tulp2.items())))
②的解法:
set(tulp1) ^ set(tulp2)
参考技术B tulp1 = 'test_two': '124', 'test_four': '185','test_one': '196', 'test_three': '26', 'test_five': '489'
tulp2 = 'test_two': '124', 'test_one': '196', 'test_three': '26'
def founction_1(d_1,d_2):
key_list_1=[]
key_list_2=[]
for key_1 in d_1:
key_list_1.append(key_1)
for key_2 in d_2:
key_list_2.append(key_2)
key_set_1=set(key_list_1)
key_set_2=set(key_list_2)
common_key_set=key_set_1&key_set_2
different_value_key_list=[]
for key in common_key_set:
if d_1[key]!=d_2[key]:
different_value_key_list.append(key)
return different_value_key_list

def founction_2(d_1,d_2):
different_value_list=[]
value_to_key_d_1=
value_to_key_d_2=
for key in d_1:
value=d_1[key]
value_to_key_d_1[value]=key
for key in d_2:
value=d_2[key]
value_to_key_d_2[value]=key
for i in value_to_key_d_1:
if i not in value_to_key_d_2:
different_value_list.append(value_to_key_d_1[i])
for i in value_to_key_d_2:
if i not in value_to_key_d_1:
if value_to_key_d_2[i] not in different_value_list:
different_value_list.append(value_to_key_d_2[i])
return different_value_list
print founction_1(tuple1,tuple2)
print founction_2(tuple1,tuple2)
由于编码的问题,肯定不能执行了,但体味一下思想吧。注:集合(set([]))在处理这方面,很方便。
参考技术C tim@crunchbang:~/workspace$ python
Python 2.7.3 (default, Mar 14 2014, 11:57:14) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> def cmpdicts(dct0, dct1):
...     diffs = set()
...     keys = set(dct0.keys() + dct1.keys())
...     for k in keys:
...             if cmp(dct0.get(k), dct1.get(k)):
...                     diffs.add(k)
...     return diffs
... 
>>> print cmpdicts(
...     'test_two': '124', 'test_four': '185','test_one': '196', 'test_three': '26', 'test_five': '489',
...     'test_two': '124', 'test_one': '196', 'test_three': '26')
set(['test_four', 'test_five'])
>>> print cmpdicts(
...     'test_two': '124', 'test_four': '185','test_one': '196', 'test_three': '26', 'test_five': '489',
...     'test_two': '122', 'test_one': '196', 'test_three': '26')
set(['test_four', 'test_five', 'test_two'])
>>> print cmpdicts(
...     'test_two': '124', 'test_four': '185','test_one': '196', 'test_three': '26', 'test_five': '489',
...     'test_two': '122', 'test_one': '196', 'test_three': '26', 'test_six': 'FFF')
set(['test_five', 'test_four', 'test_six', 'test_two'])
>>>

参考技术D 字典是为字词提供音韵、意思解释、例句、用法等等的工具书。

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)

 




























































































以上是关于python字典对比的主要内容,如果未能解决你的问题,请参考以下文章

python--列表字典元组集合对比

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

对比Python中的列表元组字典集合字符串等之间异同

python判断两个字典变化

Python字典嵌套字典排序,该怎么处理?

Python 比较两个字典大小