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


使用key参数:

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








for linux and python