python中,具體到對list進行排序的方法有倆,一個是list自帶的sort方法,這個是直接對list進行操作,只有list才包含的方法;另外一個是內建函數sorted方法,可以對所有可迭代的對象進行排序操作,在本質上,list的排序和內建函數sorted的排序是差不多的,連參數都基本上是一樣的。
主要的區別在於,list的sort方法返回的是對已經存在的列表進行操作,而內建函數sorted方法返回的是一個新的list,而不是在原來的基礎上進行的操作。
sorted語法如下:
sorted(...) sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list可以看到其中第一個參數是可迭代對象,后面的參數都是具有默認值的,重點闡述如下:
1、cmp,比較的函數,這個具有兩個參數,參數的值都是從可迭代對象中取出,此函數必須遵守的規則為,大於則返回1,小於則返回-1,等於則返回0
2、key,主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可迭代對象中,指定可迭代對象中的一個元素來進行排序
3、reverse,是否反轉,默認情況下不反轉
具體的例子如下:
使用cmp參數:
def cmp_value(x,y): if x > y : return 1 elif x < y: return -1 else: return 0 so = sorted('this is a string'.split(' '),cmp=cmp_value) print so
輸出結果為:
['a', 'is', 'string', 'this']
so = sorted('this Is a string'.split(' '),key=str.upper) print so so = sorted('This is a string'.split(' '),key=lambda x:x.lower) print so student = [('kel','C',30),('jun','A',25)] so = sorted(student,key=lambda x:x[2]) print so
輸出結果為:
['a', 'Is', 'string', 'this'] ['is', 'string', 'This', 'a']
key參數用的比較多,多用來使用的方式為key-function,來對list數據進行處理
對復雜對象進行比較:
student = [('kel','C',30),('jun','A',25)] so = sorted(student,key=lambda x:x[2]) print so class Student(object): def __init__(self,name,score,age): self.name = name self.score = score self.age = age def __repr__(self): return repr((self.name,self.score,self.age)) student_some = [Student('kel','B',35),Student('jun','C',30)] print sorted(student_some,key= lambda x :x.age)輸出結果為:
[('jun', 'A', 25), ('kel', 'C', 30)] [('jun', 'C', 30), ('kel', 'B', 35)]
在對復雜對象進行比較的時候,注意其中參數的引用,在list對象中,直接用index來進行應用;在對象的時候,必須使用對象的屬性來進行應用,如x.age
另外一個使用key的好處是,可以進行分組進行統計,配合使用itertools的groupby方法,代碼如下:
import itertools class Kel(object): #定一個對象,用名字和年齡來進行初始化 def __init__(self,name,age): self.name = name self.age = age def __repr__(self): return repr((self.name,self.age)) kel = [Kel('kel',25),Kel('jun',32),Kel('no',22),Kel('other',40)] #構造一個list
#比較年齡的大小,從而得出不同的年齡群體 def get_age(age): if age.age < 20: return 'small' elif age.age < 30: return 'middle' else: return 'old' kel_list = sorted(kel,key=get_age) #首先用年齡來進行排序 print kel_list for m,n in itertools.groupby(kel_list,key=get_age): #根據年齡來統計各個層次段的數據 print m print list(n)
middle [('kel', 25), ('no', 22)] old [('jun', 32), ('other', 40)]