您可以使用Python list的内置sort ()方法进行排序,也可以使用python的全局sorted ()方法对可重复序列进行排序并生成新序列。
1 )排序基础
简单的升序排序非常简单。 sorted ) )只需调用方法。 返回新的列表。 新list中的元素根据小于__lt__的运算符进行排序。
代码为以下: sorted ([ 5,2,3,1,4 ] )。
[ 1,2,3,4,5 ]
list.sort (也可以使用方法进行排序。 在这种情况下,将修改list本身。 此方法通常不像sorted ()那样方便,但如果不需要保留原始list,则此方法更有效。
代码: a=[ 5,2,3,1,4 ]
a.sort () )
A
[ 1,2,3,4,5 ]
另一个区别是list.sort ) )方法只在list中定义,而sorted ) )方法对所有可重复的序列都有效。
代码如下所示:sorted (,2:(b )、3: 'B )、4: 'E ) e )、5: (a ) ) )
[ 1,2,3,4,5 ]
2 ) key参数/函数
从python2.4开始,list.sort () (函数和sorted ) ) )函数添加了key参数,用于指定在比较每个元素之前调用的函数。 例如,由key指定的函数将忽略字符串的大小写。
以下代码为: sorted (thisisateststringfromandrew ).split ),key=str.lower )。
['a ',' Andrew ',' from ',' is ',' string ',' test ',' This']
key参数的值是一个函数,此函数只有一个参数,并且返回一个值进行比较。 因为这个技术可以为每个元素正确调用key指定的函数。
更广泛的使用是按复杂对象的几个值对复杂对象的顺序进行排序,如下所示:
代码: student_tuples=[
(john,) a,15 )、
(cxdxxm )、(b )、12 )、
(dave,) b,10 )、
]
sorted(student_tuples,key=lambdastudent : student [2] ) # sort by age
[(Dave )、(b )、10 )、) cxdxxm、(b )、12 )、)、john、(a )、15 ) ]
同样的技术也适用于具有命名属性的复杂对象。 例如:
代码为以下:类student :
def __init__(self,name,grade,age ) :
self.name=name
self.grade=grade
self.age=age
def __repr__(self ) :
returnrepr((self.name,self.grade,self.age ) )
student_objects=[
student('John ',' a ',15 )、
sudent(cxdxxm )、(b )、(12 )、
student('Dave ',' b ',10 )、
]
sorted(student_objects,key=lambdastudent : student.age ) # sort by age
[(Dave )、(b )、10 )、) cxdxxm、(b )、12 )、)、john、(a )、15 ) ]
3 )操作器模块函数
由于上面提到的key参数使用非常广泛,python提供了几个方便的函数,使访问方法简单快捷。 操作器模块包括项目获取器和属性获取器,从2.6开始还添加了methodcaller方法。 使用这些方法可以使上述操作更加简洁和快捷。
代码为以下: fromoperatorimportitemgetter,attrgetter
sorted(student_tuples,key=itemgetter(2) )
[(Dave )、(b )、10 )、) cxdxxm、(b )、12 )、)、john、(a )、15 ) ]
sorted(student_objects,key=attrgetter('age ) )
[(Dave )、(b )、10 )、) cxdxxm、(b )、12 )、)、john、(a )、15 ) ]
operator模块还可以进行多级排序。 例如,可以先按grade,然后按age排序。
代码:sorted(student_tuples,key=item getter (1,2 ) ) ) ) )。
[(John )、(a )、(15 )、) dave、(b、10 )、)、cxdxxm、(b、12 ) ]
sorted(student_objects,key=attrgetter('grade ',' age ' ) )
[(John )、(a )、(15 )、) dave、(b、10 )、)、cxdxxm、(b、12 ) ]
4 )升序和降序
list.sort (和sorted )都接受表示升序或降序排序的参数reverse。 例如,上面的student降序排序如下:
代码为以下:sorted(student_tuples,key=itemgetter(2,reverse=True ) )
[(John )、(a )、15 )、(cxdxxm、(b )、12 )、(dave、) b )、10 ) ]
sorted(student_objects,key=attrgetter('age ),reverse=True ) )。
[(John )、(a )、15 )、(cxdxxm、(b )、12 )、(dave、) b )、10 ) ]