Python中如何对包含字典的列表进行排序及JSON比较
本文详解在Python中对包含字典的列表进行排序的方法,解决因字典顺序不同导致的JSON比较难题。由于字典不可哈希,无法直接使用set去重排序,需利用sorted函数按字典键值排序。通过示例展示如何忽略列表内字典顺序来验证两个JSON对象是否相等,并提供相关工具推荐。
本文详细介绍在Python编程中对包含字典元素的列表进行排序的具体实现方法,供读者参考学习。
文章主要涵盖以下内容:
1. 问题背景分析 2. 列表内字典元素的排序实现 3. 忽略字典顺序的JSON对象比较方法
一、问题背景分析
假设存在两个JSON对象a和b。
a = '{"ROAD": [{"id": 123}, {"name": "no1"}]}'
b = '{"ROAD": [{"name": "no1"}, {"id": 123}]}'
这两个对象在Python解析后,其对应的键值均为列表,且列表中包含完全相同的字典元素,唯一的区别在于这些字典在列表中的排列顺序不同。若需判断这两个JSON对象是否相等(忽略列表内部字典的顺序),关键在于对列表中的字典元素进行排序。由于Python字典本身按键排序,而列表保持插入顺序,因此对列表中的字典进行排序即可解决此问题。若列表中存储的是普通元素,可通过list(set())组合实现排序;但当列表元素为字典时,该方法失效,具体报错信息如下:
>>> a = [{'a':1, 'b':2}, {'c':3}]
>>> a
[{'a': 1, 'b': 2}, {'c': 3}]
>>> b = set(a)
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
b = set(a)
TypeError: unhashable type: 'dict'
报错信息显示,字典属于不可哈希类型(普通非字典元素可通过哈希操作轻松排序)。
因此,核心问题转化为:如何对列表中的字典元素进行排序。
二、列表内字典元素的排序实现
Python列表提供了sorted函数,我们可以尝试使用该函数。
>>> p = [{'b': 2}, {'a': 1, 'c': 3}]
>>> q = [{'a': 1, 'c': 3}, {'b': 2}]
>>> p
[{'b': 2}, {'a': 1, 'c': 3}]
>>> q
[{'a': 1, 'c': 3}, {'b': 2}]
>>> pp = sorted(p)
>>> qq = sorted(q)
>>> pp
[{'b': 2}, {'a': 1, 'c': 3}]
>>> qq
[{'b': 2}, {'a': 1, 'c': 3}]
>>> pp == qq
True
>>> p == q
False
测试结果表明该方法可行,且排序依据为字典元素的键值对数量及内容。
三、忽略字典顺序的JSON对象比较
import json
def compare_json(a, b):
aa = json.loads(a)
bb = json.loads(b)
len_a = len(aa)
len_b = len(bb)
if len_a != len_b:
return False
else:
for key in aa:
if not bb.has_key(key):
return False
else:
if sorted(aa[key]) != sorted(bb[key]):
return False
return True
if __name__ == "__main__":
a = '{"ROAD": [{"id": 123}, {"name": "no1"}]}'
b = '{"ROAD": [{"name": "no1"}, {"id": 123}]}'
print compare_json(a, b)
注意事项:在手动编写JSON字符串时,若使用a = "{'road':1}"并通过json.loads(a)解析会报错,正确写法应为a = '{"road":1}',即外层使用单引号,内层使用双引号。
补充:关于JSON操作,这里推荐几款实用的在线JSON工具供参考:
在线JSON代码检验、格式化、美化工具: http://tools.jb51.net/code/json
JSON在线格式化工具: http://tools.jb51.net/code/jsonformat
在线XML与JSON互转工具: http://tools.jb51.net/code/xmljson
JSON代码在线格式化、美化、压缩、编辑及转换工具: http://tools.jb51.net/code/jsoncodeformat
在线JSON压缩与转义工具: http://tools.jb51.net/code/json_yasuo_trans
对Python其他相关知识感兴趣的读者,可查阅本站专题:《Python操作json技巧总结》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。
希望本文所述内容能对您的Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









