列表的sort方法就是用來進(jìn)行排序的。

創(chuàng)新互聯(lián)專注于金安企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城建設(shè)。金安網(wǎng)站建設(shè)公司,為金安等地區(qū)提供建站服務(wù)。全流程專業(yè)公司,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
主要就是兩個(gè)參數(shù),key,reverse
先說reverse,這個(gè)很簡單,就是指出是否進(jìn)行倒序排序:一般情況下,1排在2的前面,而倒序則相反。
key參數(shù):一般它是一個(gè)函數(shù),它接受列表中每一個(gè)元素,返回一個(gè)可用用于比較的值。
s=[1,2,3,4,5]
s.sort(key=lambda _: _**2%7)
print(s)
輸出的是:[1, 3, 4, 2, 5]
如果看不懂lambda表達(dá)式,可以看這一段等價(jià)的寫法:
def myfn(x):
....return (x * x) % 7
s=[1,2,3,4,5]
s.sort(key=myfn)
print(s)
輸出的結(jié)果是一樣的。
key使用的函數(shù)可以是自定義函數(shù)也可以pytho內(nèi)置的函數(shù),或者是某個(gè)類或者實(shí)例的方法,只要它能接受一個(gè)參數(shù),返回一個(gè)可比較的值即可。比如這樣:
s=[[1,2,4],[3,3,5],[1,1,1],[5,7,9]]
s.sort(key=max)? # 直接使用max函數(shù)作為排序依據(jù)
print(s)
[[1, 1, 1], [1, 2, 4], [3, 3, 5], [5, 7, 9]]
1. (按字母順序排列)——sort()函數(shù)
例:
cars?=['bmw','audi','toyota','subaru']
cars.sort()
print(cars)
輸出得到
['audi', 'bmw', 'subaru', 'toyota']
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
2.按字母反序排列——reverse函數(shù)
cars?=['bmw','audi','toyota','subaru']
cars.sort(reverse=True)# reverse“adj. 反面的;顛倒的;n. 倒轉(zhuǎn),反向”
print(cars)
輸出得到
['toyota', 'subaru', 'bmw', 'audi']
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
3.對(duì)列表進(jìn)行臨時(shí)排序——sorted()函數(shù)
cars?=['bmw','audi','toyota','subaru']
print("Here?is?the?original?list:")
print(cars)
print("\nHere?is?the?sorted?list:")
print(sorted(cars))
print("Here?is?the?original?list?again:")
print(cars)
輸出得到
Here is the original list:
['bmw', 'audi', 'toyota', 'subaru']
Here is the sorted list:
['audi', 'bmw', 'subaru', 'toyota']
Here is the original list again:
['bmw', 'audi', 'toyota', 'subaru']
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
4. 倒著打印列表——reverse()函數(shù)
cars?=['bmw','audi','toyota','subaru']
print(cars)
cars.reverse()
print(cars)
輸出得到
['bmw', 'audi', 'toyota', 'subaru']
['subaru', 'toyota', 'audi', 'bmw']
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
python內(nèi)置關(guān)于排序的工具主要有兩個(gè)一個(gè)是列表自帶的 sort() 方法,另外一個(gè)是 sorted() 函數(shù)。Python 列表內(nèi)置方法可以直接修改列表。而 sorted() 內(nèi)置函數(shù)從一個(gè)可迭代對(duì)象(列表,元組等都可以)構(gòu)建一個(gè)新的排序列表。其函數(shù)原型分別如下:
對(duì)列表進(jìn)行默認(rèn)排序
從函數(shù)原型來看,可以看到兩者都具有兩個(gè)可選參數(shù),它們都必須指定為關(guān)鍵字參數(shù)。
key 指定帶有單個(gè)參數(shù)的函數(shù),用于從 iterable 的每個(gè)元素中提取用于比較的鍵 (例如 key=str.lower)。默認(rèn)值為 None (直接比較元素)。 key 形參的值應(yīng)該是個(gè)函數(shù)(或其他可調(diào)用對(duì)象),它接受一個(gè)參數(shù)并返回一個(gè)用于排序的鍵。
假設(shè)有其他類型的變量,比如一個(gè)自定義的類或者列表中又是一個(gè)列表。以官網(wǎng)例子為例有這樣一個(gè)列表,其元素為元組,
可以用以下方式按照年齡排序
類似的有自定義類
可以用如下方式進(jìn)行排序
也可以顯示定義一個(gè)函數(shù),且只有一個(gè)參數(shù),返回用于排序的鍵,比如
總之就是定義一個(gè)函數(shù)返回一個(gè)用于排序的鍵,可以用lambda函數(shù)或者 def 定義都可以。
上面實(shí)現(xiàn)的簡單函數(shù)實(shí)際就是實(shí)現(xiàn)了返回一個(gè)有序結(jié)構(gòu)的第 n 的元素,或者某個(gè)類中的某個(gè)屬性,因此 Python 提供了便利功能,使訪問器功能更容易,更快捷。operator 模塊有 itemgetter() 、 attrgetter() 函數(shù)。分別完成返回第 n 個(gè)元素,某個(gè)屬性功能。上面的排序可以用如下方式進(jìn)行實(shí)現(xiàn)
在python2中,sort有一個(gè) cmp 參數(shù),即用一個(gè)函數(shù)來自定義比較,在python3中這種方式被取消。為了繼承類似的用法,在 Python 3.2 中, functools.cmp_to_key() 函數(shù)被添加到標(biāo)準(zhǔn)庫中的 functools 模塊中。
這種作用先定義如何比較兩個(gè)變量,以上面的學(xué)生列表按照年齡排序?yàn)槔?/p>
這種做法自定義比較函數(shù)接收兩個(gè)形參,返回比較結(jié)果(bool),而新式方法接受一個(gè)參數(shù),返回的是比較的鍵。
假設(shè)有字典 d = {'b':2, 'a':1,'c':8,'d':4} ,則可以通過以下方式對(duì)字典按照鍵和值進(jìn)行排序
sorted函數(shù)python介紹如下
sorted() 作為?Python?內(nèi)置函數(shù)之一,其功能是對(duì)序列(列表、元組、字典、集合、還包括字符串)進(jìn)行排序。
sorted() 函數(shù)的基本語法格式如下
list = sorted(iterable, key=None, reverse=False)
其中,iterable 表示指定的序列,key 參數(shù)可以自定義排序規(guī)則;reverse 參數(shù)指定以升序(False,默認(rèn))還是降序(True)進(jìn)行排序。sorted() 函數(shù)會(huì)返回一個(gè)排好序的列表。
注意,key 參數(shù)和 reverse 參數(shù)是可選參數(shù),即可以使用,也可以忽略。
演示sorted()函數(shù)的基本代碼用法:
#對(duì)列表進(jìn)行排序
a = [5,3,4,2,1]
print(sorted(a))
#對(duì)元組進(jìn)行排序
a = (5,4,3,1,2)
print(sorted(a))
#字典默認(rèn)按照key進(jìn)行排序
a = {4:1,\
5:2,\
3:3,\
2:6,\
1:8}
print(sorted(a.items()))
#對(duì)集合進(jìn)行排序
a = {1,5,3,2,4}
print(sorted(a))
#對(duì)字符串進(jìn)行排序
a = "51423"
print(sorted(a))
方法1.用List的內(nèi)建函數(shù)list.sort進(jìn)行排序
list.sort(func=None, key=None, reverse=False)
Python實(shí)例:
list = [2,5,8,9,3]
list
[2,5,8,9,3]
list.sort()
list
[2, 3, 5, 8, 9]
方法2.用序列類型函數(shù)sorted(list)進(jìn)行排序(從2.4開始)
Python實(shí)例:
list = [2,5,8,9,3]
list
[2,5,8,9,3]
sorted(list)
[2, 3, 5, 8, 9]
兩種方法的區(qū)別:
sorted(list)返回一個(gè)對(duì)象,可以用作表達(dá)式。原來的list不變,生成一個(gè)新的排好序的list對(duì)象。
list.sort() 不會(huì)返回對(duì)象,改變?cè)械膌ist。
其他sort的實(shí)例:
實(shí)例1:正向排序
L = [2,3,1,4]
L.sort()
L
[1,2,3,4]
實(shí)例2:反向排序
L = [2,3,1,4]
L.sort(reverse=True)
L
[4,3,2,1]
實(shí)例3:對(duì)第二個(gè)關(guān)鍵字排序
L = [('b',6),('a',1),('c',3),('d',4)]
L.sort(lambda x,y:cmp(x[1],y[1]))
L
[('a', 1), ('c', 3), ('d', 4), ('b', 6)]
實(shí)例4: 對(duì)第二個(gè)關(guān)鍵字排序
L = [('b',6),('a',1),('c',3),('d',4)]
L.sort(key=lambda x:x[1])
L
[('a', 1), ('c', 3), ('d', 4), ('b', 6)]
實(shí)例5: 對(duì)第二個(gè)關(guān)鍵字排序
L = [('b',2),('a',1),('c',3),('d',4)]
import operator
L.sort(key=operator.itemgetter(1))
L
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
實(shí)例6:(DSU方法:Decorate-Sort-Undercorate)
L = [('b',2),('a',1),('c',3),('d',4)]
A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort
A.sort()
L = [s[2] for s in A]
L
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
以上給出了6中對(duì)List排序的方法,其中實(shí)例3.4.5.6能起到對(duì)以List item中的某一項(xiàng)
為比較關(guān)鍵字進(jìn)行排序.
效率比較:
cmp DSU key
通過實(shí)驗(yàn)比較,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相當(dāng)
多關(guān)鍵字比較排序:
實(shí)例7:
L = [('d',2),('a',4),('b',3),('c',2)]
L.sort(key=lambda x:x[1])
L
[('d', 2), ('c', 2), ('b', 3), ('a', 4)]
我們看到,此時(shí)排序過的L是僅僅按照第二個(gè)關(guān)鍵字來排的,
如果我們想用第二個(gè)關(guān)鍵字排過序后再用第一個(gè)關(guān)鍵字進(jìn)行排序呢?有兩種方法
實(shí)例8:
L = [('d',2),('a',4),('b',3),('c',2)]
L.sort(key=lambda x:(x[1],x[0]))
L
[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
實(shí)例9:
L = [('d',2),('a',4),('b',3),('c',2)]
L.sort(key=operator.itemgetter(1,0))
L
[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
為什么實(shí)例8能夠工作呢?原因在于tuple是的比較從左到右比較的,比較完第一個(gè),如果相等,比較第二個(gè)
本文名稱:設(shè)計(jì)一個(gè)排序函數(shù)python 定義一個(gè)排序函數(shù)
文章網(wǎng)址:http://chinadenli.net/article14/dooehge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、面包屑導(dǎo)航、電子商務(wù)、網(wǎng)站設(shè)計(jì)、企業(yè)建站、云服務(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í)需注明來源: 創(chuàng)新互聯(lián)