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

来源:互联网 发布:mac虚拟机免费版下载 编辑:程序博客网 时间:2024/05/29 19:26

使用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)



0 0
原创粉丝点击