Python对数组与字典提供了两种排序方法:

  • List成员函数sort() 在本地排序,不返回副本
  • Build-in 函数sorted() 返回副本,原始输入不变

在帮助中心下,两个函数的描述分别如下:

help(sorted)
Help on built-in function sorted in module builtin:
sorted(iterable, cmp=None, key=None, reverse=False) —> new sorted list

help(list.sort)
Help on method_descriptor:
L.sort(cmp=None, key=None, reverse=False) — stable sort IN PLACE;
cmp(x, y) -> -1, 0, 1

参数说明

iterable:是可迭代类型;
cmp:用于比较的函数,比较什么由key决定;
key:用列表元素的某个属性或函数进行作为关键字,有默认值,迭代集合中的一项;
reverse:排序规则. reverse = True 降序 或者 reverse = False 升序,有默认值。
返回值:是一个经过排序的可迭代类型,与iterable一样。

其中cmpkey两个参数需要单独注意

cmp参数

cmp接受一个函数,拿整形举例,形式为:

1
2
def f(a,b):
     return a-b

如果排序的元素是其他类型的,如果a逻辑小于b,函数返回负数;a逻辑等于b,函数返回0;a逻辑大于b,函数返回正数就行了

key参数

key也是接受一个函数,不同的是,这个函数只接受一个元素,形式如下

1
2
def f(a):
     return len(a)

key接受的函数返回值,表示此元素的权值,sort将按照权值大小进行排序


下面列举几个例子说明sorted()函数的用法

1、按文件名排序
1
2
3
4
5
6
7
def get_extension(filename):
    """返回当前对象的文件名,以'.'分隔后最后一个元素"""
    return filename.split(".")[-1]

def extsort(filenames):
    """以文件名进行排序,其中key的值调用上面函数得出所有数组内文件名列表"""
    return sorted(filenames, key=get_extension)
2、按照列表中每个对象中的第三个元素进行排序
1
2
3
4
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]  
>>> sorted(students, key=lambda student : student[2])   # sort by age  
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]  
"""y"""