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 函数对多个字段排序,只能统一排序方式,不能针对不同的字段按不同的方式排序。
- list.sort(*, key=None, reverse=False)
- 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}]