文章目录
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)
运行结果:
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)
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)
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)))
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')))
运行结果:
3 对字典排序
对字典排序返回的是列表,可以对 key 进行排序,可以对 value 进行排序,也可以对 items 进行排序
d = {1: 'D', 2: 'C', 3: 'B', 4: 'A'}
print(sorted(d))
print(sorted(d.values()))
print(sorted(d.items()))
运行结果
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)
运行结果