Python 内置的 sort() 方法可以实现对列表的原地排序功能。内置的 sorted() 函数则不会修改原列表,而是生成一个经过排序的新列表。
下面总结一些常用的排序方法。
基本排序
最简单的方法就是使用 sorted() 函数,它将返回一个经过排序的新列表:
sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
你也可以使用 list.sort() 方法, 但是它会修改原列表,所以一般使用 sorted()。如果你不再需要原始列表的话,用用 list.sort() 也无妨。a = [5, 2, 3, 1, 4]
a.sort()
a
[1, 2, 3, 4, 5]
另一个不同点是,list.sort() 方法只能作用于列表,而 sorted() 函数则接受任何可迭代对象。sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
[1, 2, 3, 4, 5]
Key 函数
从 Python 2.4 开始, list.sort() 及 sorted() 增加了一个 key 参数,该参数接受一个函数作为它的值,可以通过那个函数定义排序应该遵循的规则。
比如,对字符串做不区分大小写的排序:
sorted("This is a test string from Andrew".split(), key=str.lower)
对照
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']sorted("This is a test string from Andrew".split())
['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
key 参数的值必须是个函数,该函数有一个参数(列表元素)并且返回一个用来排序的 key(按这个 key 进行排序)。
一般通过使用对象的某个索引作为 key 的值来对复杂对象进行排序。比如对一个多维数组进行排序:
student_tuples = [
按列表元素(元组)的第3个值排序
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
这个技术也可以用来按对象的属性值进行排序。比如: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))student_objects = [
按 age 属性的值排序
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]sorted(student_objects, key=lambda student: student.age) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]