Python中的sort()方法用于數(shù)組排序,下面以實(shí)例形式對(duì)此加以詳細(xì)說(shuō)明:

成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),故城網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:故城等地區(qū)。故城做網(wǎng)站價(jià)格咨詢:028-86922220
一、基本形式
列表有自己的sort方法,其對(duì)列表進(jìn)行原址排序,既然是原址排序,那顯然元組不可能擁有這種方法,因?yàn)樵M是不可修改的。
x?=?[4,?6,?2,?1,?7,?9]x.sort()
print?x?#?[1,?2,?4,?6,?7,?9]
如果需要一個(gè)排序好的副本,同時(shí)保持原有列表不變,怎么實(shí)現(xiàn)呢
x?=[4,?6,?2,?1,?7,?9]
y?=?x[?:?]
y.sort()
print?y?#[1,?2,?4,?6,?7,?9]
print?x?#[4,?6,?2,?1,?7,?9]
注意:y = x[:] 通過(guò)分片操作將列表x的元素全部拷貝給y,如果簡(jiǎn)單的把x賦值給y:y = x,y和x還是指向同一個(gè)列表,并沒(méi)有產(chǎn)生新的副本。
另一種獲取已排序的列表副本的方法是使用sorted函數(shù):
x?=[4,?6,?2,?1,?7,?9]
y?=?sorted(x)
print?y?#[1,?2,?4,?6,?7,?9]
print?x?#[4,?6,?2,?1,?7,?9]
sorted返回一個(gè)有序的副本,并且類型總是列表,如下:
print?sorted('Python')?#['P',?'h',?'n',?'o',?'t',?'y']
二、自定義比較函數(shù)
可以定義自己的比較函數(shù),然后通過(guò)參數(shù)傳遞給sort方法:
def?comp(x,?y):
if?x??y:
return?1
elif?x??y:
return?-1
else:
return?0
nums?=?[3,?2,?8?,0?,?1]
nums.sort(comp)
print?nums?#?降序排序[8,?3,?2,?1,?0]
nums.sort(cmp)?#?調(diào)用內(nèi)建函數(shù)cmp?,升序排序
print?nums?#?降序排序[0,?1,?2,?3,?8]
三、可選參數(shù)
sort方法還有兩個(gè)可選參數(shù):key和reverse
1、key在使用時(shí)必須提供一個(gè)排序過(guò)程總調(diào)用的函數(shù):
x?=?['mmm',?'mm',?'mm',?'m'?]
x.sort(key?=?len)
print?x?#?['m',?'mm',?'mm',?'mmm']
2、reverse實(shí)現(xiàn)降序排序,需要提供一個(gè)布爾值:
y?=?[3,?2,?8?,0?,?1]
y.sort(reverse?=?True)
print?y?#[8,?3,?2,?1,?0]
python有兩個(gè)內(nèi)置的函數(shù)用于實(shí)現(xiàn)排序,一個(gè)是list.sort()函數(shù),一個(gè)是sorted()函數(shù)。
區(qū)別1:list.sort()函數(shù)只能處理list類型數(shù)據(jù)的排序;sorted()則可以處理多種類型數(shù)據(jù)的排序。
區(qū)別2:list.sort()會(huì)修改原來(lái)的list為排序后的結(jié)果;sorted()不會(huì)修改原來(lái)的數(shù)據(jù),只是返回一個(gè)排序后的對(duì)象。
下面來(lái)動(dòng)手寫點(diǎn)代碼進(jìn)行測(cè)試:
list進(jìn)行簡(jiǎn)單的排序
1 a=['a','f','c','x','e']2 a.sort()3 a4 [a','c','e','f','x']
sorted()進(jìn)行簡(jiǎn)單排序
1 a=['a','f','c','x','e']2 a_new=sorted(a)3 a_new4 ['a', 'c', 'e', 'f', 'x']
list.sort()和sorted都有默認(rèn)的參數(shù)reverse,該參數(shù)的默認(rèn)值為“False”,即默認(rèn)升序排列。如果要進(jìn)行降序排列:
1 a=['a','f','c','x','e']2 a_new=sorted(a,reverse=True)3 a_new4 ['x', 'f', 'e', 'c', 'a']
對(duì)元組進(jìn)行排列,不能使用list.sort()函數(shù):
1 a=('a','f','c','x','e')2 a_new=a.sort()3
4 ttributeError: 'tuple' object has no attribute 'sort'
對(duì)字典的排序可以按照字典的key或者value進(jìn)行排序:
1 dic={"aa":11,"ff":5,"ee":22}2 printsorted(dic.keys())3 ['aa', 'ee', 'ff']
從python2.4開(kāi)始list.sort()和sorted()都引入了key參數(shù)來(lái)指定一個(gè)函數(shù)進(jìn)行排序,有了key參數(shù)以后我們就可以對(duì)更加復(fù)雜的數(shù)據(jù)進(jìn)行排序 。
假如需要排序的數(shù)據(jù)為一個(gè)list,但list的每一個(gè)元素都是一個(gè)字典,排序的方法如下:
dic=[{"name":"sunny","age":20},
{"name":"bell","age":5},
{"name":"jim","age":1},
{"name":"jan","age":10}]print sorted(dic,key=lambda arg:arg.get('age'),reverse=False) #按照每個(gè)字典的age的值進(jìn)行排序,字典的方法dict.get(key)將返回指定鍵的值。
#輸出結(jié)果為:[{'age': 1, 'name': 'jim'}, {'age': 5, 'name': 'bell'}, {'age': 10, 'name': 'jan'}, {'age': 20, 'name': 'sunny'}]
print sorted(dic,key=lambda arg:arg.get('name'),reverse=False) #按照每個(gè)字典的name的值進(jìn)行排序
#輸出結(jié)果為:[{'age': 5, 'name': 'bell'}, {'age': 10, 'name': 'jan'}, {'age': 1, 'name': 'jim'}, {'age': 20, 'name': 'sunny'}]
假如需要排序的數(shù)據(jù)為一個(gè)二維的list,即list的每一個(gè)元素也是一個(gè)list,方法與上面的例子類似:
a=[['100','8','30'],['200','5','50'],['300','1','20']]print sorted(a,key=lambda arg:arg[1]) #按照每個(gè)list的第1個(gè)元素進(jìn)行排序
[['300', '1', '20'], ['200', '5', '50'], ['100', '8', '30']]
前面的2個(gè)例子中,key參數(shù)的值都是函數(shù)。在sorted函數(shù)中,key參數(shù)后面的函數(shù)的參數(shù)的數(shù)量只能是一個(gè)。lambda arg:arg.get('age')是一個(gè)lambda匿名函數(shù),它是一個(gè)沒(méi)有函數(shù)名的單語(yǔ)句函數(shù)。冒號(hào)左邊是參數(shù),冒號(hào)右邊的返回值,返回值將被用于排序。
Python使用過(guò)程隨記~
sort()函數(shù)與sorted()函數(shù)的區(qū)別:
sort是list的方法,而sorted可以對(duì)所有可迭代對(duì)象進(jìn)行排序(字典,元組等);
sort方法返回的是對(duì)已經(jīng)存在的列表進(jìn)行操作,會(huì)改變?cè)辛斜淼闹担欢鴖orted是新建一個(gè)新的list,不改變?cè)械闹怠?/p>
一.list sort()方法
語(yǔ)法:
key:主要是用來(lái)比較的參數(shù),指定對(duì)象中的一個(gè)對(duì)象用來(lái)進(jìn)行排序。
reserve:默認(rèn)值為reserve=False升序,reserve=True降序。
無(wú)返回值,通常如下:
指定列表中的元素排序來(lái)輸出:
二.sorted
語(yǔ)法:
iterable:可迭代對(duì)象
key:主要是用來(lái)比較的參數(shù),指定對(duì)象中的一個(gè)對(duì)象用來(lái)進(jìn)行排序。
reserve:默認(rèn)值為reserve=False升序,reserve=True降序。
利用key進(jìn)行倒序排序:
或者通過(guò)reserve參數(shù),與sort()函數(shù)一致。
若列表內(nèi)元素為字典/元組,還可以通過(guò)key指定來(lái)排序:
一、基本形式
sorted(iterable[, cmp[, key[, reverse]]])
iterable.sort(cmp[, key[, reverse]])
參數(shù)解釋:
(1)iterable指定要排序的list或者iterable,不用多說(shuō);
(2)cmp為函數(shù),指定排序時(shí)進(jìn)行比較的函數(shù),可以指定一個(gè)函數(shù)或者lambda函數(shù),如:
students為類對(duì)象的list,沒(méi)個(gè)成員有三個(gè)域,用sorted進(jìn)行比較時(shí)可以自己定cmp函數(shù),例如這里要通過(guò)比較第三個(gè)數(shù)據(jù)成員來(lái)排序,代碼可以這樣寫:
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=lambda student : student[2])
(3)key為函數(shù),指定取待排序元素的哪一項(xiàng)進(jìn)行排序,函數(shù)用上面的例子來(lái)說(shuō)明,代碼如下:
sorted(students, key=lambda student : student[2])
key指定的lambda函數(shù)功能是去元素student的第三個(gè)域(即:student[2]),因此sorted排序時(shí),會(huì)以students所有元素的第三個(gè)域來(lái)進(jìn)行排序。
二、普通用法:
1.原址排序
1)列表有自己的sort方法,其對(duì)列表進(jìn)行原址排序,既然是原址排序,那顯然元組不可能擁有這種方法,因?yàn)樵M是不可修改的。
x = [4, 6, 2, 1, 7, 9]
x.sort()
print x # [1, 2, 4, 6, 7, 9]
2.副本排序
1)[:]分片方法
x =[4, 6, 2, 1, 7, 9]
y = x[ : ]
y.sort()
print y #[1, 2, 4, 6, 7, 9]
print x #[4, 6, 2, 1, 7, 9]
注意:y = x[:] 通過(guò)分片操作將列表x的元素全部拷貝給y,如果簡(jiǎn)單的把x賦值給y:y = x,y和x還是指向同一個(gè)列表,并沒(méi)有產(chǎn)生新的副本。
2)sorted方法
sorted返回一個(gè)有序的副本,并且類型總是列表,如下:
x =[4, 6, 2, 1, 7, 9]
y = sorted(x)
print y #[1, 2, 4, 6, 7, 9]
print x #[4, 6, 2, 1, 7, 9]
print sorted('Python') #['P', 'h', 'n', 'o', 't', 'y']
三、高級(jí)用法
1.自定義cmp比較函數(shù)
def comp(x, y):
if x y:
return 1
elif x y:
return -1
else:
return 0
nums = [3, 2, 8 ,0 , 1]
nums.sort(comp)
print nums # 降序排序[8, 3, 2, 1, 0]
nums.sort(cmp) # 調(diào)用內(nèi)建函數(shù)cmp ,升序排序
print nums # 降序排序[0, 1, 2, 3, 8]
2.自定義key和reverse
1.reverse實(shí)現(xiàn)降序排序,需要提供一個(gè)布爾值,默認(rèn)為False(升序排列)。
2.key在使用時(shí)必須提供一個(gè)排序過(guò)程總調(diào)用的函數(shù):
alist = [('2', '3', '10'), ('1', '2', '3'), ('5', '6', '7'), ('2', '5', '10'), ('2', '4', '10')]
# 多級(jí)排序,先按照第3個(gè)元素排序,然后按照第2個(gè)元素排序:
print sorted(alist, cmp = None, key = lambda x:(int(x[2]), int(x[1])), reverse = False)
-------------------------------------------------------------------------------------------
[('1', '2', '3'), ('5', '6', '7'), ('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10')]
四、operator.itemgetter函數(shù)
operator模塊提供的itemgetter函數(shù)用于獲取對(duì)象的哪些維的數(shù)據(jù),參數(shù)為一些序號(hào)(即需要獲取的數(shù)據(jù)在對(duì)象中的序號(hào)),下面看例子。
a = [1,2,3]
b=operator.itemgetter(1) //定義函數(shù)b,獲取對(duì)象的第1個(gè)域的值
b(a)
2
b=operator.itemgetter(1,0) //定義函數(shù)b,獲取對(duì)象的第1個(gè)域和第0個(gè)的值
b(a)
(2, 1)
要注意,operator.itemgetter函數(shù)獲取的不是值,而是定義了一個(gè)函數(shù),通過(guò)該函數(shù)作用到對(duì)象上才能獲取值。
itemgetter在sort中的用法:
from operator import itemgetter
alist = [('2', '3', '10'), ('1', '2', '3'), ('5', '6', '7'), ('2', '5', '10'), ('2', '4', '10')]
# 多級(jí)排序,先按照第3個(gè)元素排序,然后按照第2個(gè)元素排序:
print sorted(alist, cmp = None, key = itemgetter(2, 1), reverse = False)
print sorted(alist, cmp = None, key = lambda x:itemgetter(2, 1)(x), reverse = False)
print sorted(alist, cmp = None, key = lambda x:map(int, itemgetter(2, 1)(x)), reverse = False)
--------------------------------------------------------------------------------------------------
[('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10'), ('1', '2', '3'), ('5', '6', '7')]
[('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10'), ('1', '2', '3'), ('5', '6', '7')]
[('1', '2', '3'), ('5', '6', '7'), ('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10')]
在 Python 中,可以使用內(nèi)置函數(shù) sorted() 將無(wú)序的集合轉(zhuǎn)換成有序的集合。
例如,有一個(gè)無(wú)序的集合 A,你可以這樣轉(zhuǎn)換它:
Copy code
A = {3, 2, 1}
B = sorted(A)
print(B) # 輸出 [1, 2, 3]
sorted() 函數(shù)默認(rèn)按升序排列,也可以通過(guò)參數(shù) reverse 指定按降序排列。例如:
Copy code
A = {3, 2, 1}
B = sorted(A, reverse=True)
print(B) # 輸出 [3, 2, 1]
注意,sorted() 函數(shù)是一個(gè)針對(duì)列表、元組、字符串等序列類型的排序函數(shù),如果要對(duì)集合進(jìn)行排序,需要先將集合轉(zhuǎn)換為序列類型,再使用 sorted() 函數(shù)。
希望這些信息能幫到你!
進(jìn)行一個(gè)簡(jiǎn)單的升序排列直接調(diào)用sorted()函數(shù),函數(shù)將會(huì)返回一個(gè)排序后的列表:
sorted函數(shù)不會(huì)改變?cè)械膌ist,而是返回一個(gè)新的排好序的list
如果你想使用就地排序,也就是改變?cè)璴ist的內(nèi)容,那么可以使用list.sort()的方法,這個(gè)方法的返回值是None。
另一個(gè)區(qū)別是,list.sort()方法只是list也就是列表類型的方法,只可以在列表類型上調(diào)用。而sorted方法則是可以接受任何可迭代對(duì)象。
list.sort()和sorted()函數(shù)都有一個(gè)key參數(shù),可以用來(lái)指定一個(gè)函數(shù)來(lái)確定排序的一個(gè)優(yōu)先級(jí)。比如,這個(gè)例子就是根據(jù)大小寫的優(yōu)先級(jí)進(jìn)行排序:
key參數(shù)的值應(yīng)該是一個(gè)函數(shù),這個(gè)函數(shù)接受一個(gè)參數(shù)然后返回以一個(gè)key,這個(gè)key就被用作進(jìn)行排序。這個(gè)方法很高效,因?yàn)閷?duì)于每一個(gè)輸入的記錄只需要調(diào)用一次key函數(shù)。
一個(gè)常用的場(chǎng)景就是當(dāng)我們需要對(duì)一個(gè)復(fù)雜對(duì)象的某些屬性進(jìn)行排序時(shí):
再如:
前面我們看到的利用key-function來(lái)自定義排序,同時(shí)Python也可以通過(guò)operator庫(kù)來(lái)自定義排序,而且通常這種方法更好理解并且效率更高。
operator庫(kù)提供了 itemgetter(), attrgetter(), and a methodcaller()三個(gè)函數(shù)
同時(shí)還支持多層排序
list.sort()和sorted()都有一個(gè)boolean類型的reverse參數(shù),可以用來(lái)指定升序和降序排列,默認(rèn)為false,也就是升序排序,如果需要降序排列,則需將reverse參數(shù)指定為true。
排序的穩(wěn)定性指,有相同key值的多個(gè)記錄進(jìn)行排序之后,原始的前后關(guān)系保持不變
我們可以看到python中的排序是穩(wěn)定的。
我們可以利用這個(gè)穩(wěn)定的特性來(lái)進(jìn)行一些復(fù)雜的排序步驟,比如,我們將學(xué)生的數(shù)據(jù)先按成績(jī)降序然后年齡升序。當(dāng)排序是穩(wěn)定的時(shí)候,我們可以先將年齡升序,再將成績(jī)降序會(huì)得到相同的結(jié)果。
傳統(tǒng)的DSU(Decorate-Sort-Undecorate)的排序方法主要有三個(gè)步驟:
因?yàn)樵M是按字典序比較的,比較完grade之后,會(huì)繼續(xù)比較i。
添加index的i值不是必須的,但是添加i值有以下好處:
現(xiàn)在python3提供了key-function,所以DSU方法已經(jīng)不常用了
python2.x版本中,是利用cmp參數(shù)自定義排序。
python3.x已經(jīng)將這個(gè)方法移除了,但是我們還是有必要了解一下cmp參數(shù)
cmp參數(shù)的使用方法就是指定一個(gè)函數(shù),自定義排序的規(guī)則,和java等其他語(yǔ)言很類似
也可以反序排列
python3.x中可以用如下方式:
標(biāo)題名稱:python降序排列函數(shù) Python降序排序
本文路徑:http://chinadenli.net/article12/hppegc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、域名注冊(cè)、面包屑導(dǎo)航、企業(yè)建站、ChatGPT、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)