Python中如何对包含字典的列表进行排序及JSON比较

Ada
Ada
发布时间:2026-10-13 | 3人浏览过
原创

本文详解在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程序设计有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表