基本排序
Python 列表有一个内置的 list.sort() 方法可以直接修改列表。
还有一个 sorted() 内置函数,它会从一个可迭代对象构建一个新的排序列表。
list.sort() 方法只是为列表定义的,而 sorted() 函数可以接受任何可迭代对象。
排序结果默认是升序
sorted([5, 2, 3, 1, 4])
a = [5, 2, 3, 1, 4]
a.sort()
自定义cmp排序
需要使用 functools.cmp_to_key() 函数
from functools import cmp_to_key
# 降序
def cmp_sort(worker1, worker2):
if worker1.age != worker2.age:
return 1 if worker1.age < worker2.age else -1
if worker1.salary != worker2.salary:
return 1 if worker1.salary < worker2.salary else -1
if worker1.level != worker2.level:
return 1 if worker1.level < worker2.level else -1
class Worker:
def __init__(self, age, salary, level):
self.age = age # 年龄
self.salary = salary # 工资
self.level = level # 职称
def __str__(self):
return 'age=' + str(self.age) + ',' + 'salary=' + str(self.salary) + ',' + 'level=' + str(self.level)
worker_list = [Worker(80, 7000, 8), Worker(80, 8000, 8), Worker(40, 5000, 9), Worker(30, 5000, 5), Worker(30, 6000, 5),
Worker(30, 6000, 6)]
worker_list.sort(key=cmp_to_key(cmp_sort))
for worker in worker_list:
print(worker)
# age=80,salary=8000,level=8
# age=80,salary=7000,level=8
# age=40,salary=5000,level=9
# age=30,salary=6000,level=6
# age=30,salary=6000,level=5
# age=30,salary=5000,level=5
关键字排序
list.sort() 和 sorted() 都有一个 key 形参用来指定在进行比较前要在每个列表元素上调用的函数(或其他可调用对象)。
常结合lambda表达式
from functools import cmp_to_key
class Worker:
def __init__(self, age, salary, level):
self.age = age
self.salary = salary
self.level = level
def __str__(self):
return 'age=' + str(self.age) + ',' + 'salary=' + str(self.salary) + ',' + 'level=' + str(self.level)
worker_list = [Worker(80, 7000, 8), Worker(80, 8000, 8), Worker(40, 5000, 9), Worker(30, 5000, 5), Worker(30, 6000, 5),
Worker(30, 6000, 6)]
sorted(worker_list,key=lambda Worker:(Worker.age,Worker.salary,Worker.level))
for worker in worker_list:
print(worker)
升序降序与稳定排序
list.sort() 和 sorted() 接受布尔值的 reverse 参数,这用于标记降序排序。
排序保证是 稳定 的。 这意味着当多个记录具有相同的键值时,将保留其原始顺序。
这个属性允许在一系列排序步骤中构建复杂的排序。例如,要按 grade 降序然后 age 升序对学生数据进行排序,请先 age 排序,然后再使用 grade 排序:
s = sorted(student_objects, key=attrgetter('age'))
sorted(s, key=attrgetter('grade'), reverse=True)
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]