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}]
相关推荐
吃茄子的猫4 小时前
quecpython中&的具体含义和使用场景
开发语言·python
じ☆冷颜〃4 小时前
黎曼几何驱动的算法与系统设计:理论、实践与跨领域应用
笔记·python·深度学习·网络协议·算法·机器学习
数据大魔方4 小时前
【期货量化实战】日内动量策略:顺势而为的短线交易法(Python源码)
开发语言·数据库·python·mysql·算法·github·程序员创富
APIshop4 小时前
Python 爬虫获取 item_get_web —— 淘宝商品 SKU、详情图、券后价全流程解析
前端·爬虫·python
风送雨4 小时前
FastMCP 2.0 服务端开发教学文档(下)
服务器·前端·网络·人工智能·python·ai
效率客栈老秦5 小时前
Python Trae提示词开发实战(8):数据采集与清洗一体化方案让效率提升10倍
人工智能·python·ai·提示词·trae
哈里谢顿5 小时前
一条 Python 语句在 C 扩展里到底怎么跑
python
znhy_235 小时前
day46打卡
python
Edward.W5 小时前
Python uv:新一代Python包管理工具,彻底改变开发体验
开发语言·python·uv
小熊officer5 小时前
Python字符串
开发语言·数据库·python