内置的list.sort()方法可以直接修改列表;sorted()内置函数会从一个可迭代对象构建一个新的排序列表。
基本排序
sorted()函数
简单的升序排列,调用sorted()函数,会返回一个新的已排序列表。
>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
list.sort()方法
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)函数
list.sort() 和sorted() 都有一个key 形参来指定在进行比较之前要在每个列表元素上进行调用的
函数。
>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
key 形参的值应该是一个函数,它接受一个参数并并返回一个用于排序的键。
这种技巧速度很快,因为对于每个输入记录只会调用一次key 函数。
一种常见的模式是使用对象的一些索引作为键对复杂对象进行排序。例如:
>>> student_tuples = [
... ('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)]
升序和降序
list.sort() 和sorted() 接受布尔值的reverse 参数。这用于标记降序排序。
例如,要以反向age 顺序获取学生数据:
>>> sorted(student_tuples, key=x:x[2], reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
表示将列表按照每个数据元素的第三项进行降序排列。