python 递归比较两个dict或json(相等,包含)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37023538/article/details/54379591

使用python经常会遇到对比dict和json相等问题。

1 比较两个json相等或包含:

   先将json转换dict。然后进行比较。

  转换的的方法:http://blog.csdn.net/qq_37023538/article/details/53693222

2 python递归对比两个dict的代码

def cmp_dict(src_data,dst_data):   
    assert type(src_data) == type(dst_data),"type: '{}' != '{}'".format(type(src_data), type(dst_data))
    if isinstance(src_data,dict):
        assert len(src_data) == len(dst_data),"dict len: '{}' != '{}'".format(len(src_data), len(dst_data))
        for key in src_data:                
            assert dst_data.has_key(key)    
            cmp_dict(src_data[key],dst_data[key])    
    elif isinstance(src_data,list):                  
        assert len(src_data) == len(dst_data),"list len: '{}' != '{}'".format(len(src_data), len(dst_data))    
        for src_list, dst_list in zip(sorted(src_data), sorted(dst_data)):
            cmp_dict(src_list, dst_list)
    else:
        assert src_data == dst_data,"value '{}' != '{}'".format(src_data, dst_data)

if __name__ == "__main__":
    xx = {"111":None,"23456":{"22222":9999,"33333":"0000","list":["3333","4444","111"]}}
    yy = {"111":None,"23456":{"22222":9999,"33333":"0000","list":["111","3333","4444"]}}
    cmp_dict(xx,yy)

  由于json,dict中可能包含list结果,所以要处理list。

3 dst_data包含src_data:

   上面的代码去掉数据元素个数相等比较就可以了。

def cmp_dict(src_data,dst_data):   
    assert type(src_data) == type(dst_data),"type: '{}' != '{}'".format(type(src_data), type(dst_data))
    if isinstance(src_data,dict):
        for key in src_data:                
            assert dst_data.has_key(key)    
            cmp_dict(src_data[key],dst_data[key])    
    elif isinstance(src_data,list):                      
        for src_list, dst_list in zip(sorted(src_data), sorted(dst_data)):
            cmp_dict(src_list, dst_list)
    else:
        assert src_data == dst_data,"value '{}' != '{}'".format(src_data, dst_data)

if __name__ == "__main__":
    xx = {"111":None,"23456":{"22222":9999,"33333":"0000","list":["3333","4444","111"]}}
    yy = {"111":None,"23456":{"22222":9999,"33333":"0000","list":["111","3333","4444"]}}
    cmp_dict(xx,yy)



阅读更多

没有更多推荐了,返回首页