Python 中的多重排序

Python 中的多重排序

需求

假设有列表数据如下:

复制代码
students = [ {"name":"Bob", "grade":1, "age":6, "score":100},
             {"name":"Peter", "grade":1, "age":6, "score":98},
             {"name":"Alice", "grade":2, "age":7, "score":90},
             {"name":"Mary", "grade":2, "age":8, "score":92}]

需要先按年级从小到大排序,然后按年龄从大到小排序,再按分数从高到低排序,最后按姓名排序。

虽然 Python 内置了排序功能,比如下面两种常见的排序,能够通过 key 函数对多个字段排序,只能统一排序方式,不能针对不同的字段按不同的方式排序。

  1. list.sort(*, key=None, reverse=False)
  2. sorted(iterable, /, *, key=None, reverse=False)

解决方案

Python 中的排序在值相同时会保留记录的位置。我们可以利用这个特性来实现复杂的排序。

针对上面的问题,我们需要实现自己的排序函数。

复制代码
from operator import itemgetter

def msort(data, specs):
    for key, reverse in reversed(specs):
        data.sort(key=itemgetter(key), reverse=reverse)
    return data

对上面的数据进行排序,得到的结果和我们预期的一致

复制代码
msort(students, [["grade", False], ["age", True], ["score", True], ["name", False]])

[{'name': 'Bob', 'grade': 1, 'age': 6, 'score': 100},
 {'name': 'Peter', 'grade': 1, 'age': 6, 'score': 98},
 {'name': 'Mary', 'grade': 2, 'age': 8, 'score': 92},
 {'name': 'Alice', 'grade': 2, 'age': 7, 'score': 90}]
相关推荐
好运的阿财几秒前
OpenClaw工具拆解之 sessions_list+sessions_history
人工智能·python·程序人生·ai·ai编程·openclaw
Ulyanov2 分钟前
打造现代化雷达电子对抗仿真界面 第三篇:综合电子战指挥控制台——多视图协同与插件化架构
python·架构·系统仿真·雷达电子战
杜子不疼.2 分钟前
Python + AI 实战:用 LangChain 搭建企业级 RAG 知识库
人工智能·python·langchain
无敌昊哥战神4 分钟前
【算法与数据结构】深入浅出回溯算法:理论基础与核心模板(C/C++与Python三语解析)
c语言·数据结构·c++·笔记·python·算法
甄心爱学习4 分钟前
【项目实训(个人3)】
vue.js·人工智能·python·个人开发
平安的平安7 分钟前
MCP 协议实战:用 Python 开发你的第一个 AI 工具服务
网络·人工智能·python
宸津-代码粉碎机9 分钟前
Spring Boot 4.0 进阶实战+源码解析系列(持续更新)—— 从落地到源码,搞定面试与工作
java·人工智能·spring boot·后端·python·面试
Z.风止11 分钟前
Large Model-learning(4)
人工智能·pytorch·笔记·python·深度学习·机器学习
不知名XL14 分钟前
day02 mcp开发以及skill开发规范
python
好家伙VCC2 小时前
**神经编码新视角:用Python实现生物启发的神经信号压缩与解码算法**在人工智能飞速发展的今天
java·人工智能·python·算法