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}]
相关推荐
Knight_AL1 分钟前
Java 可变参数 Object... args 详解:原理、用法与实战场景
java·开发语言·python
智算菩萨1 分钟前
迷宫生成算法:从生成树到均匀随机,再到工程化 Python 实现
python·算法·游戏
深蓝海拓3 分钟前
PySide6从0开始学习的笔记(十二) QProgressBar(进度条)
笔记·python·qt·学习·pyqt
xwill*10 分钟前
Python 的类型提示(type hint)
开发语言·pytorch·python
汉堡go13 分钟前
python_chapter3
开发语言·python
天呐草莓24 分钟前
企业微信运维手册
java·运维·网络·python·微信小程序·企业微信·微信开放平台
2501_9216494925 分钟前
股票 API 对接, 接入德国法兰克福交易所(FWB/Xetra)实现量化分析
后端·python·websocket·金融·区块链
lbb 小魔仙27 分钟前
Python 读取 Excel 文件:openpyxl 与 pandas 实战对比
python·excel·pandas
程序员miki28 分钟前
Redis核心命令以及技术方案参考文档(分布式锁,缓存业务逻辑)
redis·分布式·python·缓存
热爱生活的五柒30 分钟前
两个电脑(windows和linux之间)如何快速传输文件(亲测可用,方便快捷)
python·共享文件夹