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