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}]
相关推荐
用户83562907805113 小时前
无需 Office:Python 批量转换 PPT 为图片
后端·python
markfeng815 小时前
Python+Django+H5+MySQL项目搭建
python·django
GinoWi16 小时前
Chapter 2 - Python中的变量和简单的数据类型
python
JordanHaidee16 小时前
Python 中 `if x:` 到底在判断什么?
后端·python
ServBay16 小时前
10分钟彻底终结冗长代码,Python f-string 让你重获编程自由
后端·python
闲云一鹤16 小时前
Python 入门(二)- 使用 FastAPI 快速生成后端 API 接口
python·fastapi
Rockbean17 小时前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
曲幽18 小时前
FastAPI + Ollama 实战:搭一个能查天气的AI助手
python·ai·lora·torch·fastapi·web·model·ollama·weatherapi
用户606487671889619 小时前
国内开发者如何接入 Claude API?中转站方案实战指南(Python/Node.js 完整示例)
人工智能·python·api
只与明月听20 小时前
RAG深入学习之Chunk
前端·人工智能·python