python内建函数sorted方法概述

来源:互联网 发布:水木年华知乎 编辑:程序博客网 时间:2024/06/10 20:18

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 0so = sorted('this is a string'.split(' '),cmp=cmp_value)print so

输出结果为:

['a', 'is', 'string', 'this']


使用key参数:

so = sorted('this Is a string'.split(' '),key=str.upper)print soso = sorted('This is a string'.split(' '),key=lambda x:x.lower)print sostudent = [('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 soclass 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 itertoolsclass 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_listfor 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)]







0 0