列表排序有三种方法:
reverse()方法、sort()方法、sorted()方法。
1.reverse():
列表反转排序。把原列表中的元素顺序从左至右反转过来重新存放,而不会对列表中的参数进行排序整理,即不会根据大小排序。
eg:
list1=['d',6,'e',5,'f',4]
list1.reverse()
list1
>>>[4, 'f', 5, 'e', 6, 'd']
2.sort():
对列表内容进行升序排序,直接修改原列表的排序,排序后的新列表会覆盖原列表。
eg:
list1=['e',6,'d',5,'f',4]
list1.sort()
list1
>>>[4, 5, 6, 'd', 'e', 'f']
3.1 sorted():
排序时保留原列表,返回一个排序好的新列表。
eg:
list1=['e',6,'d',5,'f',4]
list2=sorted(list1)
list2
>>>[4, 5, 6, 'd', 'e', 'f']
3.2 sorted([data] [,cmp=None、key=None] [,reverse=False]) [ ]内的部分表示可省
data是待排序数据,可以是list或者iterator,cmp和key都是函数,这两个函数作用于data的元素上产生一个结果,sorted()方法根据这个结果来排序。
cmp(e1,e2)是带两个参数的比较函数,返回值:-1表示:e1<e2 0表示:e1==e2 1表示:e1>e2 。 cmp默认None(用内建的比较函数)。
key用来为每个元素提取比较值。默认为None(直接比较每个元素)
reverse=False表示升序排列。reverse=True表示降序排列。
eg:对由tuple组成的列表排序
list1=[('e',6),('d',5),('f',4)]
list2=[(1,'b',3),(3,'a',2),(6,'d',5)]
#(使用key)
list3=sorted(list1,key=lambda list1:list1[0]) #以第一个元素进行排序
list4=sorted(list2,key=lambda list2:list2[2]) #以最后一个元素进行排序
list3
>>>[('d', 5), ('e', 6), ('f', 4)]
list4
>>>[(3, 'a', 2), (1, 'b', 3), (6, 'd', 5)]
#(使用cmp)
list5=sorted(list1,cmp=lambda x,y:cmp(x[0],y[0]))
list5
>>>[('d', 5), ('e', 6), ('f', 4)]
理解此处 cmp(x[0],y[0]):每次取list1中两个元组的第一个元素,进行两两比较,然后按大小排序。如list1=[('e',6),('d',5),('f',4)] 第一次取'e'和'd'两两比较大小,再排序,再取下一个元组的第一个元素依次比较下去,直到整个列表中的每个元组的第一个元素都两两比较完则比较完毕。
使用opterator函数加快速度
import operator
list1=[('e',5),('d',8),('f',4)]
list6=sorted(list1,key=operator.itemgetter(0))
>>>[('d',8), ('e',5), ('f',4)]
使用opterator函数进行多级排序
import operator
list_sorted=sorted(list,key=operator.itemgetter(0,2))
#先根据第1个域排序,再根据第3个域排序。
eg:对包含字典的列表排序
list1=[{'name':'S','age':24},{'name':'G','age':26},{'name':'Z','age':25}]
list_sorted_1=sorted(list1,key=operator.itemgetter('name')) #升序
list_sorted_2=sorted(list1,key=lambda list1:list1['age'],reverse=True) #降序
list_sorted_1
>>>[{'age': 26, 'name': 'G'}, {'age': 24, 'name': 'S'}, {'age': 25, 'name': 'Z'}]
list_sorted_2
>>>[{'age': 26, 'name': 'G'}, {'age': 25, 'name': 'Z'}, {'age': 24, 'name': 'S'}]