用python对比两个字典的差异

文章介绍了如何使用Python3编写代码来对比两个包含嵌套结构的字典,包括查找键的差异、列表元素的缺失以及值的不同,并提供了具体的代码示例。此方法适用于API接口数据对比,目前限制为列表元素全为字符串的情况。
摘要由CSDN通过智能技术生成


前言

在工作中或者某些场景,我们需要去对比两个字典对象的差异性。尤其是软件版本升级的时候我们需要去验证一些API接口返回的数据,升级前后数据是否一致,如果不一致,则需要打印出这些不一致的地方,人工或者代码去判断是否满足功能要求。


一、使用目的和设计思路

例如现在有两个字典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'}

这两个字典的结构稍微偏复杂,里面嵌套了列表和字典,这种嵌套结构的数据在API接口中很常见。现在我们想要对这两个字典进行对比,我们期望得到如下对比结果:

1)dict1中有而dict2中缺失的key;dict2中有而dict1中缺失的key

2)dict1和dict2中嵌套的列表中缺失的元素

3)dict1和dict2中相同key却不同值的差异打印

4)如上的打印,都需要打印出字典中key的绝对路径

二、使用步骤

1.python3环境代码

代码如下:

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.字典对比的结果打印

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中缺失


总结

可以很好的对比出两个字典的差异,运用到工作中则能对应实现对比两份json数据的差异。只是目前代码中对于嵌套列表,列表只支持元素全是字符串的情况。欢迎大家提出意见!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值