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)]
