python 自定義排序

2021-09-07 08:07:04 字數 4095 閱讀 3035

我們都知道python中有兩種排序的方法,

原地排序的x.sort(),和不改變原列表有返回值的sorted(x)

自定義排序函式

先不關心其實原地排序還是有返回值的排序,研究其內部的排序原理,其內部是根據什麼排序的呢,預設的排序方法是內建的cmp函式

對於cmp(x,y):

如果想要x排在y前面那麼返回乙個負數,如果想x排在y後面那麼返回乙個正數

根據這個原理我們可以自定義一些排序函式compare_personal,並將這個函式傳入sort或sorted方法中。

在python2中,用關鍵字cmp直接傳入即可,

a =[1

,2,4

,3,5

]def compare_personal:

pass

a.sort(

cmp=compare_personal)

sorted

(a,cmp

=compare_personal)

而在python3中,cmp關鍵字被移除了,這樣的寫法就無法執行了,需要借助functools包來完成

a =[1

,2,4

,3,5

]def

compare_personal

(x,y)

:pass

a.sort(key= functools.cmp_to_key(compare_personal)

)c =

sorted

(b, key=functools.cmp_to_key(compare_personal)

)

好了,知道如何使用以後就可以構建自定義的排序函式,比如們要對乙個陣列進行排序,排序的依據是元素mode7後的大小,按照公升序排列,我們可以電泳儀排序函式如下

import  functools

a =[3,

8,14,

6,7]

defcompare_personal

(x,y)

:return x%

7-y%

7a.sort(key=functools.cmp_to_key(compare_personal)

)b =

sorted

(a,key=functools.cmp_to_key(compare_personal)

)print

(a)print

(b)>>

>[14

,7,8

,3,6

]>>

>[14

,7,8

,3,6

]

按照某一元素進行排序

加入我們有下面的資料,列表中都是元組,我們想根據元組中的某些元素進行排序。

元組中的三個元素分別表示姓名,班級和年齡

students =[(

"zhangsan"

,"a",10

),("lisi"

,"c",9

),("lisi1"

,"a",9

),("lisi2"

,"b",9

),("wangwu"

,"b",13

)]

我們只需要把要排序的元素通過lamada 表示式返回即可,

students.sort(key=

lambda x:

(x[2

],x[1]

))print

(students)

>>[(

'lisi1'

,'a',9

),('lisi2'

,'b',9

),('lisi'

,'c',9

),('zhangsan'

,'a',10

),('wangwu'

,'b',13

)]

返回乙個很好理解,就是根據那乙個元素進行排序,上面的**中返回了兩個元素,也就是資料中x[2]相同的資料會根據x[1]再排個序

如果是物件的話也是乙個道理,lamada返回物件中要排序的屬性名稱即可

class

student

:def

__init__

(self,name,age,weight)

: self.name = name

self.age = age

self.weight = weight

std1 = student(

"std1",10

,55)std2 = student(

"std2",8

,30)std3 = student(

"std3",11

,65)std4 = student(

"std4",9

,50)students =

[std1,std2,std3,std4]

students.sort(key=

lambda x:x.age)

for std in students:

print

(std.name)

>>

>

std2

std4

std1

std3

利用operator 模組指定排序元素

上面我們說了兩種情況,乙個是排序元組要通過下標來指定要被排序的元素,第二種是排序物件,要通過指定屬性名來指定排序依據的屬性。operator模組的attrgetteritemgetter

itemgetter可用來指定下標

attrgetter可用來指定屬性名

import operator

students =[(

"zhangsan"

,"a",10

),("lisi"

,"c",9

),("lisi1"

,"a",9

),("lisi2"

,"b",9

),("wangwu"

,"b",13

)]students.sort(key=operator.itemgetter(2)

)print

(students)

>>

>[(

'zhangsan'

,'a',10

),('lisi1'

,'a',9

),('lisi2'

,'b',9

),('wangwu'

,'b',13

),('lisi'

,'c',9

)]

import  operator

class

student

:def

__init__

(self,name,age,weight)

: self.name = name

self.age = age

self.weight = weight

std1 = student(

"std1",10

,55)std2 = student(

"std2",8

,30)std3 = student(

"std3",11

,65)std4 = student(

"std4",9

,80)students =

[std1,std2,std3,std4]

students.sort(key= operator.attrgetter(

"weight"))

for std in students:

print

(std.name)

>>

>

std2

std1

std3

std4

python 自定義排序函式

自定義排序函式 python內建的 sorted 函式可對list進行排序 sorted 36,5,12,9,21 5,9,12,21,36 但 sorted 也是乙個高階函式,它可以接收乙個比較函式來實現自定義排序,比較函式的定義是,傳入兩個待比較的元素 x,y,如果 x 應該排在 y 的前面,返...

python中自定義排序函式

python內建的 sorted 函式可對list進行排序 sorted 36,5,12,9,21 5,9,12,21,36 但 sorted 也是乙個高階函式,它可以接收乙個比較函式來實現自定義排序,比較函式的定義是,傳入兩個待比較的元素 x,y,如果 x 應該排在 y 的前面,返回 1,如果 x...

DataGridView自定義排序

net自帶datagridview排序貌似最終都是用datagridview.sort 發現當是用排序後,datagridview將把排序前的行樣式等重置,仔細測試後覺得貌似是排序時datagridview重新繫結了資料來源,具體不得而知.實在沒有辦法破解,我也不想重新寫比較來排序,用了最土的辦法,...