python列表排序 

简单记一下python中List的sort方法(或者sorted内建函数)的用法。 

关键字: 
python列表排序 python字典排序 sorted 


List的元素可以是各种东西,字符串,字典,自己定义的类等。 

sorted函数用法如下: 


1. sorted(data, cmp=None, key=None, reverse=False)

其中,data是待排序数据,可以使List或者iterator, cmp和key都是函数,这两个函数作用与data的元素上产生一个结果,sorted方法根据这个结果来排序。 

cmp(e1, e2) 是带两个参数的比较函数, 返回值: 负数: e1 < e2, 0: e1 == e2, 正数: e1 > e2. 默认为 None, 即用内建的比较函数. 

key 是带一个参数的函数, 用来为每个元素提取比较值. 默认为 None, 即直接比较每个元素. 

通常, key 和 reverse 比 cmp 快很多, 因为对每个元素它们只处理一次; 而 cmp 会处理多次. 


通过例子来说明sorted的用法: 


1. 对由tuple组成的List排序 


1. >>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]


用key函数排序(lambda的用法见 注释1) 

1. >>> sorted(students, key=lambda student : student[2])   # sort by age
2. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]


用cmp函数排序 

1. >>> sorted(students, cmp=lambda x,y : cmp(x[2], y[2])) # sort by age
2. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]


用 operator 函数来加快速度, 上面排序等价于:(itemgetter的用法见 注释2) 

1. >>> from operator import
2. >>> sorted(students, key=itemgetter(2))


用 operator 函数进行多级排序 

1. >>> sorted(students, key=itemgetter(1,2))  # sort by grade then by age
2. [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]



2. 对由字典排序 

1. >>> d = {'data1':3, 'data2':1, 'data3':2, 'data4':4}  
2. >>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)  
3. [('data4', 4), ('data1', 3), ('data3', 2), ('data2', 1)]


注释1 

参考:http://jasonwu.me/2011/10/29/introduce-to-python-lambda.html 


注释2 

参考:http://ar.newsmth.net/thread-90745710c90cf1.html 

相当于 

class itemgetter(__builtin__.object)  
 
 |  itemgetter(item, ...) --> itemgetter object  
 
 |  
 
 |  Return a callable object that fetches the given item(s) from its operand.  
 
 |  After, f=itemgetter(2), the call f(r) returns r[2].  
 
 |  After, g=itemgetter(2,5,3), the call g(r) returns (r[2], r[5], r[3])

1. def
2. def
3.         r = obj[i]   
4. if
5. for i in
6. return
7. return
8.   
9. >>> a = [1,2,3]   
10. >>> b=operator.itemgetter(1)   
11. >>> b(a)   
12. 2
13. >>> b=operator.itemgetter(1,0)   
14. >>> b(a)   
15. (2, 1)   
16. >>> b=itemgetter(1)   
17. >>> b(a)   
18. 2
19. >>> b=itemgetter(1,0)   
20. >>> b(a)   
21. (2, 1)



我们需要对List进行排序,Python提供了两个方法
对给定的List L进行排序,
方法1.用List的成员函数sort进行排序
方法2.用built-in函数sorted进行排序(从2.4开始)

--------------------------------sorted--------------------------------------- 
   
 >>> help(sorted) 
   
 Help on built-in function sorted in module __builtin__: 
   

 sorted(...) 
   
     sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list 
   
 ---------------------------------sort---------------------------------------- 
   
 >>> help(list.sort) 
   
 Help on method_descriptor: 
   

 sort(...) 
   
     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一样。
 
注;一般来说,cmp和key可以使用lambda表达式。

sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。

Sorting basic:

>>> print sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]
>>> L = [5, 2, 3, 1, 4]
>>> L.sort()
>>> print L
[1, 2, 3, 4, 5]
Sorting  cmp:
 >>>L = [('b',2),('a',1),('c',3),('d',4)] 
    
 >>>print  
    sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) 
    
 [('a', 1), ('b', 2), ('c', 3), ('d', 4)] 
    

Sorting  keys:
 >>>L = [('b',2),('a',1),('c',3),('d',4)] 
    
 >>>print  
    sorted(L, key=lambda x:x[1])) 
    
 [('a', 1), ('b', 2), ('c', 3), ('d', 4)]

Sorting  reverse:

>>> print sorted([5, 2, 3, 1, 4], reverse=True)
[5, 4, 3, 2, 1]
>>> print sorted([5, 2, 3, 1, 4], reverse=False)
[1, 2, 3, 4, 5]

注:效率key>cmp(key比cmp快)


在Sorting Keys中:我们看到,此时排序过的L是仅仅按照第二个关键字来排的,如果我们想用第二个关键字
排过序后再用第一个关键字进行排序呢?
>>> L = [('d',2),('a',4),('b',3),('c',2)]
>>> print sorted(L, key=lambda x:(x[1],x[0]))
>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]

以上环境python2.4