Python list 内置 sort() 方法用来排序,也可以用 python 内置的全局 sorted() 方法来对可迭代的序列排序生成新的序列。

1 基本形式

列表有自己的 sort 方法,其对列表进行原址排序。元组不行,元组不可修改

>>> a = [3,6,1,8,0,5,7,9,2,4]
>>> a.sort()
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a = [3,6,1,8,0,5,7,9,2,4]
>>> res = sorted(a)
>>> a
[3, 6, 1, 8, 0, 5, 7, 9, 2, 4]
>>> res
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2 复杂列表

2.1 列表内容是元组

student = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
res = sorted(student, key=lambda student: student[2])   # sort by age
print(res)

运行结果:
python3 中 sort 方法与 sorted 函数的使用_python

2.2 列表内容是类

class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age
    def __repr__(self):
        return repr((self.name, self.grade, self.age))

students = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]

res = sorted(students, key=lambda s: s.age)
print(res)

python3 中 sort 方法与 sorted 函数的使用_python_02

2.3 列表内容是字典

student = [
    {"name": "xiaoming", "score": 60},
    {"name": "daxiong", "score": 20},
    {"name": "maodou", "score": 30},
]

res = sorted(student, key=lambda d:d['score'])
print(res)

python3 中 sort 方法与 sorted 函数的使用_python_03

2.4 itemgetter 与 attrgetter

Python 提供了 operator.itemgetter 和 attrgetter 提高执行速度

from operator import itemgetter, attrgetter

stu = [
    ("A", 30),
    ("B", 20),
    ("C", 10)
]

print(sorted(stu, key=itemgetter(1)))
#operator提供了多个字段的复杂排序,先对第0个字段排序,再对第一个字段排序
print(sorted(stu, key=itemgetter(0,1)))

python3 中 sort 方法与 sorted 函数的使用_python_04

from operator import itemgetter, attrgetter
class Student:
    def __init__(self, name, grade, age):
            self.name = name
            self.grade = grade
            self.age = age
    def __repr__(self):
            return repr((self.name, self.grade, self.age))


stu = [
    Student('jane', 'B', 12),
    Student('john', 'A', 12),
    Student('dave', 'B', 10),
]
# 对students按照年龄排序
print(sorted(stu, key=attrgetter('age')))
# 其等价于
print(sorted(stu, key=lambda o: o.age))

# 也可以按多个key排序, 先按age再按grade排序
print(sorted(stu, key=attrgetter('age', 'grade')))

运行结果:
python3 中 sort 方法与 sorted 函数的使用_python_05

3 对字典排序

对字典排序返回的是列表,可以对 key 进行排序,可以对 value 进行排序,也可以对 items 进行排序

d = {1: 'D', 2: 'C', 3: 'B', 4: 'A'}
print(sorted(d))
print(sorted(d.values()))
print(sorted(d.items()))

运行结果
python3 中 sort 方法与 sorted 函数的使用_python_06

4 cmp_to_key(自定义的比较函数)

python3 以后,sort 方法和 sorted 函数中的 cmp 参数被取消,此时如果还需要使用自定义的比较函数,那么可以使用 cmp_to_key 函数。与接受 key function 的工具一同使用(如 sorted(),min(),max(),heapq.nlargest(),itertools.groupby())

from functools import cmp_to_key

a = [3, 6, 1, 8, 0, 5, 7, 9, 2, 4]


def cmp(x, y):
    if x > y:
        return -1
    elif x < y:
        return 1
    else:
        return 0

b = sorted(a, key=cmp_to_key(cmp))
print(b)

运行结果
python3 中 sort 方法与 sorted 函数的使用_python_07