文章目錄
- 前言
- 一、使用目的和設(shè)計思路
-
二、使用步驟
- 1.python3環(huán)境代碼
- 2.字典對比的打印結(jié)果
- 總結(jié)
前言
在工作中或者某些場景,我們需要去對比兩個字典對象的差異性。尤其是軟件版本升級的時候我們需要去驗證一些API接口返回的數(shù)據(jù),升級前后數(shù)據(jù)是否一致,如果不一致,則需要打印出這些不一致的地方,人工或者代碼去判斷是否滿足功能要求。
一、使用目的和設(shè)計思路
例如現(xiàn)在有兩個字典dict1和dict2,我要找出這兩個字典之間的差異。
dict1 = {'name':'古天樂','age':26,'cars': {'BMW':['740','X5'],'Audi':'A8','Porsche':['Cayenne']},'愛好':['射擊','足球'],'city':'WUH','school':'DMT'}
dict2 = {'name':'古天樂','age':27,'cars':{'BMW':['740','X3','535Li']},'愛好':['射擊','籃球'],'cityname':'WUH'}
這兩個字典的結(jié)構(gòu)稍微偏復(fù)雜,里面嵌套了列表和字典,這種嵌套結(jié)構(gòu)的數(shù)據(jù)在API接口中很常見?,F(xiàn)在我們想要對這兩個字典進行對比,我們期望得到如下對比結(jié)果:
1)dict1中有而dict2中缺失的key;dict2中有而dict1中缺失的key
2)dict1和dict2中嵌套的列表中缺失的元素
3)dict1和dict2中相同key卻不同值的差異打印
4)如上的打印,都需要打印出字典中key的絕對路徑
二、使用步驟
1.python3環(huán)境代碼
代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-548146.html
dict1 = {'name':'古天樂','age':26,'cars': {'BMW':['740','X5'],'Audi':'A8','Porsche':['Cayenne']},'愛好':['射擊','足球'],'city':'WUH','school':'DMT'}
dict2 = {'name':'古天樂','age':27,'cars':{'BMW':['740','X3','535Li']},'愛好':['射擊','籃球'],'cityname':'WUH'}
class CompareHandle():
def __init__(self):
pass
def compareDictionaries(self,dict1:dict,dict2:dict,path=''):
err = ''
key_err = ''
value_err = ''
listValue_err = ''
oldpath = path
for k in dict1.keys():
if oldpath != '':
path = f'{oldpath}->{k}'
else:
path = f'{k}'
if k not in dict2:
key_err += f'{path}:該key在dict2中缺失\n'
else:
if isinstance(dict1[k],dict) and isinstance(dict2[k],dict):
err += self.compareDictionaries(dict1[k],dict2[k],path)
else:
if dict1[k] != dict2[k]:
if isinstance(dict1[k],list) and isinstance(dict2[k],list):
if isinstance(dict1[k][0],str): #暫時只考慮list中對象全為str的情況
diffList1 = list(set(dict1[k])-set(dict2[k]))
diffList2 = list(set(dict2[k]) - set(dict1[k]))
if diffList1 != [] and diffList2 == []:
listValue_err += f'{path}:{diffList1}該元素在ditc2中缺失\n'
elif diffList1 == [] and diffList2 != []:
listValue_err += f'{path}:{diffList2}該元素在ditc1中缺失\n'
else:
listValue_err += f'{path}:{diffList1}該元素在ditc2中缺失\n'
listValue_err += f'{path}:{diffList2}該元素在ditc1中缺失\n'
# print(key_err)
else:
value_err += f'{path}:\n'
value_err += f'\t- {dict1[k]}\n'
value_err += f'\t- {dict2[k]}\n'
for k in dict2.keys():
if oldpath != '':
path = f'{oldpath}->{k}'
else:
path = f'{k}'
if k not in dict1:
key_err += f'{path}:該key在dict1中缺失\n'
return key_err + value_err + err + listValue_err
compareHandle = CompareHandle()
ret = compareHandle.compareDictionaries(dict1,dict2)
print(ret)
2.字典對比的結(jié)果打印
city:該key在dict2中缺失
school:該key在dict2中缺失
cityname:該key在dict1中缺失
age:
- 26
- 27
cars->Audi:該key在dict2中缺失
cars->Porsche:該key在dict2中缺失
cars->BMW:['X5']該元素在ditc2中缺失
cars->BMW:['X3', '535Li']該元素在ditc1中缺失
愛好:['足球']該元素在ditc2中缺失
愛好:['籃球']該元素在ditc1中缺失
總結(jié)
可以很好的對比出兩個字典的差異,運用到工作中則能對應(yīng)實現(xiàn)對比兩份json數(shù)據(jù)的差異。只是目前代碼中對于嵌套列表,列表只支持元素全是字符串的情況。歡迎大家提出意見!文章來源地址http://www.zghlxwxcb.cn/news/detail-548146.html
到了這里,關(guān)于用python對比兩個字典的差異的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!