python2.7中提供了两种方法对list进行排序,分别是list成员函数sort及built-in函数sorted.
函数原型分别如下:
1) sort(…)
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1
2) sorted(…)
sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
2个函数参数及功能基本一致,唯一的区别是sort是在原有list上修改排序,sorted则是排序生成新的列表。
以sorted函数为例,参数详解如下:
1)iterable:能够一次返回它的一个成员的对象。iterable主要包括3类:
第一类是所有的序列类型,比如list(列表)、str(字符串)、tuple(元组)。
第二类是一些非序列类型,比如dict(字典)、file(文件)。
第三类是你定义的任何包含iter()或getitem()方法的类的对象。
2)cmp:比较函数,这个函数接收两个参数(iterable的元素)
如果第一个参数小于第二个参数,返回一个负数;
如果第一个参数等于第二个参数,返回零;
如果第一个参数大于第二个参数,返回一个正数。默认值为None。
3)key:指定一个接收一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None。
4)reverse:是一个布尔值。如果设置为True,列表元素将被降序排列,默认为升序排列。
5)返回值:是一个经过排序的可迭代类型,与iterable一样。
注1:key和reverse比一个等价的cmp函数处理速度要快。这是因为对于每个列表元素,cmp都会被调用多次,而key和reverse只被调用一次。
注2:cmp和key可以使用lambda表达式
示例代码如下:
L=[('a',4),('a',1),('c',3),('d',3)]
print sorted(L,cmp=lambda i,j:cmp(i[0],j[0]),reverse=True) #按第一个关键字倒序排列
print sorted(L,cmp=lambda i,j:cmp(i[1],j[1]),reverse=True) #按第二关键字倒序排列
print sorted(L,key=lambda i:(i[0]),reverse=True) #按第一个关键字倒序排列
print sorted(L,key=lambda i:(i[1]),reverse=True) #按第二关键字倒序排列
print sorted(L,key=lambda i:(i[0],i[1]),reverse=True) #关联第一,第二关键字倒序排列
print sorted(L,key=lambda i:(i[1],i[0]),reverse=True) #关联第二,第一关键字倒序排列
运行结果
[('d', 3), ('c', 3), ('a', 4), ('a', 1)]
[('a', 4), ('c', 3), ('d', 3), ('a', 1)]
[('d', 3), ('c', 3), ('a', 4), ('a', 1)]
[('a', 4), ('c', 3), ('d', 3), ('a', 1)]
[('d', 3), ('c', 3), ('a', 4), ('a', 1)]
[('a', 4), ('d', 3), ('c', 3), ('a', 1)]