python內建函數sorted方法概述


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








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM