python中List的sort方法指南
简单记一下python中List的sort方法(或者sorted内建函数)的用法。
List的元素可以是各种东西,字符串,字典,自己定义的类等。
sorted函数用法如下:
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排序
>>>students=[('john','A',15),('jane','B',12),('dave','B',10),]
用key函数排序(lambda的用法见注释1)
>>>sorted(students,key=lambdastudent:student[2])#sortbyage [('dave','B',10),('jane','B',12),('john','A',15)]
用cmp函数排序
>>>sorted(students,cmp=lambdax,y:cmp(x[2],y[2]))#sortbyage [('dave','B',10),('jane','B',12),('john','A',15)]
用operator函数来加快速度,上面排序等价于:(itemgetter的用法见注释2)
>>>fromoperatorimportitemgetter,attrgetter >>>sorted(students,key=itemgetter(2))
用operator函数进行多级排序
>>>sorted(students,key=itemgetter(1,2))#sortbygradethenbyage [('john','A',15),('dave','B',10),('jane','B',12)]
2.对由字典排序
>>>d={'data1':3,'data2':1,'data3':2,'data4':4} >>>sorted(d.iteritems(),key=itemgetter(1),reverse=True) [('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
classitemgetter(__builtin__.object) |itemgetter(item,...)-->itemgetterobject | |Returnacallableobjectthatfetchesthegivenitem(s)fromitsoperand. |After,f=itemgetter(2),thecallf(r)returnsr[2]. |After,g=itemgetter(2,5,3),thecallg(r)returns(r[2],r[5],r[3])
相当于
defitemgetter(i,*a): deffunc(obj): r=obj[i] ifa: r=(r,)+tuple(obj[i]foriina) returnr returnfunc >>>a=[1,2,3] >>>b=operator.itemgetter(1) >>>b(a) 2 >>>b=operator.itemgetter(1,0) >>>b(a) (2,1) >>>b=itemgetter(1) >>>b(a) 2 >>>b=itemgetter(1,0) >>>b(a) (2,1)
参考资料:
1.http://www.linuxso.com/linuxbiancheng/13340.html
2.http://www.douban.com/note/13460891/