python排序代碼,python 自定義排序

 2023-11-07 阅读 49 评论 0

摘要:我們都知道python中有兩種排序的方法, 原地排序的x.sort(),和不改變原列表有返回值的sorted(x) 自定義排序函數 先不關心其實原地排序還是有返回值的排序,研究其內部的排序原理,其內部是根據什么排序的呢,默認的排序方法是內建的cmp函數 對

我們都知道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]
def compare_personal(x,y):return x%7-y%7
a.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]

按照某一元素進行排序

python排序代碼?加入我們有下面的數據,列表中都是元組,我們想根據元組中的某些元素進行排序。
元組中的三個元素分別表示姓名,班級和年齡

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 = nameself.age = ageself.weight = weightstd1 = 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 = nameself.age = ageself.weight = weightstd1 = 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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/169872.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息