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}]
相关推荐
大千AI助手19 小时前
Web 接口性能测试最佳实践:从“压一压”到“压明白”
python·api·性能测试·测试·性能·压测·大千ai助手
维度攻城狮1 天前
ros2参数通信案例
开发语言·windows·python·ros2·参数通信
深圳佛手1 天前
不用智能体开发框架,如何调用工具?
前端·python
清水白石0081 天前
Python 与尾递归:为何不优化?如何优雅绕过?
开发语言·python
王大傻09281 天前
使用python for循环与ord() + chr()实现字符串加密
开发语言·python
540_5401 天前
ADVANCE Day35
人工智能·python·深度学习
郑泰科技1 天前
python深度学习报错:Original error was: No module named ‘numpy.core._multiarray_umath‘
python·深度学习·numpy
不要em0啦1 天前
从0开始学python:函数与数据容器
开发语言·python
无限码力1 天前
华为OD技术面真题 - Python开发 -3
python·华为od·华为od技术面真题·华为od面试八股文·华为od面试python八股文·华为od技术面八股真题
0思必得01 天前
[Web自动化] Requests模块响应的内容
运维·前端·python·自动化·html·web自动化