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

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

本文详解在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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。