排序 sorted函數(shù)和lambda的組合應(yīng)用(python3)
本筆記可以領(lǐng)會(huì)sorted()排序函數(shù)與lambda匿名函數(shù)的用法
sorted()函數(shù)和lambda函數(shù)的應(yīng)用,能有效提高代碼效率,但初學(xué)者容易混淆,下面對(duì)這兩個(gè)函數(shù)及其應(yīng)用進(jìn)行分拆講解。
一、關(guān)于函數(shù)sorted()
sorted()?函數(shù)對(duì)所有可迭代的對(duì)象進(jìn)行排序操作。sorted的語法如下:
sorted(iterable, key=None, reverse=False)
參數(shù)說明:
iterable -- 可迭代對(duì)象。
key?-- 主要是用來進(jìn)行比較的元素,只有一個(gè)參數(shù),具體的函數(shù)的參數(shù)就是取自于可迭代對(duì)象中,指定可迭代對(duì)象中的一個(gè)元素來進(jìn)行排序。
reverse?-- 排序規(guī)則,reverse = True 降序 , reverse = False 升序(默認(rèn))。
返回值:重新排序的列表。
二、關(guān)于函數(shù)lambda:
匿名函數(shù)lambda:是指一類無需定義標(biāo)識(shí)符(函數(shù)名)的函數(shù)或子程序。lambda 函數(shù)可以接收任意多個(gè)參數(shù) (包括可選參數(shù)) 并且返回單個(gè)表達(dá)式的值。
lambda匿名函數(shù)的格式:冒號(hào)前是參數(shù),可以有多個(gè),用逗號(hào)隔開,冒號(hào)右邊的為表達(dá)式。其實(shí)lambda返回值是一個(gè)函數(shù)的地址,也就是函數(shù)對(duì)象。
需要要注意的是:lambda 函數(shù)包含的表達(dá)式只能是一個(gè)。
例如,定義一個(gè)返回?cái)?shù)的平方的lambda:
a=lambda x:x*x
print(a(3))? ??
那么輸出值是:9
?如果我們只需要一個(gè)簡單的函數(shù),lambda 是一個(gè)很好的選擇,因?yàn)樗梢员豢醋魇嵌x函數(shù)的一種更簡單的方法。因此,我們可以給它一個(gè)名稱,并像普通函數(shù)一樣使用它。add_ten() 和 lambda_add_ten() 方法的結(jié)果是相同的,但是 lambda 函數(shù)可以使我們的代碼更短更清晰。如以下簡單函數(shù):
Python中使用lambda的話,寫成這樣
lambda包含的表達(dá)式不能超過一個(gè)。任何能夠使用它的地方,都可以定義一個(gè)單獨(dú)的普通函數(shù)來進(jìn)行替換。我將它用在需要封裝特殊的、非重用代碼上,避免代碼充斥著大量單行函數(shù)。
三、幾個(gè)實(shí)際案例
看到幾個(gè)sorted與lambda的例子,很有代表性,了解了這些,這兩個(gè)函數(shù)使用就容易理解了
1. 對(duì)列表中的數(shù)字按字符串長度排序
b=sorted([13,1,237,89,100],?key=lambda?x:?len(str(x)))
print(b)
----------------------------------------------------------------------
[1,?13,?89,?237,?100]
剛看到這段代碼有點(diǎn)繞不開了,仔細(xì)拆開,就迎刃而解了。
首先,sorted里面是兩個(gè)參數(shù),一個(gè)是數(shù)列[13,1,237,89,100],另一個(gè)是lambda函數(shù):key=lambda?x:?len(str(x)),這里最容易混淆的是key,可能有人會(huì)把他當(dāng)成定義的lambda函數(shù)名,其實(shí)key是sorted函數(shù)中的參數(shù)名稱關(guān)鍵字。因此,這里就是對(duì)數(shù)列按照llambda函數(shù)返回值進(jìn)行排序,也就是按照轉(zhuǎn)換成字符串長度排序。
很明顯,按照轉(zhuǎn)換的字符串長度,數(shù)列[13,1,237,89,100]長度應(yīng)該依次是:[2,1,3,2,3]。
因此,對(duì)數(shù)列[13,1,237,89,100]按長度排列結(jié)果如下:
[1,?13,?89,?237,?100]
?
2. 按列表內(nèi)運(yùn)算結(jié)果排序
x=[[1,3,3],[2,3,1]]
y=sorted(x,?key=lambda?item:item[0]+item[2])
print(y)
--------------------------------------------------------------
[[2,?3,?1],?[1,?3,?3]]
例子1中已經(jīng)講了sorted()函數(shù)的結(jié)構(gòu)和key的作用。很明顯這是對(duì)兩個(gè)列表按照列表中第0和第2個(gè)的和排序,第1個(gè)列表第0個(gè)和第2個(gè)是1+3=4,第2個(gè)列表第0個(gè)和第2個(gè)是2+1=3,第1個(gè)列表值大于第2個(gè)列表的,因此第2個(gè)列表前移,得到結(jié)果:
[[2,?3,?1],?[1,?3,?3]]
?
3. 對(duì)元組按元組元素值排序?
?
x=[('a',?3),?('b',4),?('c',1)]
r=sorted(x,?key=lambda?y:y[1])
print(r)
--------------------------------------
[('c',?1),?('a',?3),?('b',?4)]
很明顯,這個(gè)表達(dá)式是對(duì)x元組列表按照每個(gè)元組第2個(gè)元素排列,結(jié)果如下:
[('c',?1),?('a',?3),?('b',?4)]
4.將字符串,按照字符中的數(shù)字進(jìn)行排序
在Python中,如果要按照字符串中的數(shù)字進(jìn)行排序,需要使用自定義排序方法。Python內(nèi)置的排序方法只能按照字符串的字典序進(jìn)行排序。我們可以通過對(duì)字符串中數(shù)字的提取和比較來實(shí)現(xiàn)正確的排序。如果通過普通的Python函數(shù)來實(shí)現(xiàn),代碼如下:
在上面的示例代碼中,我們定義了一個(gè)convert_text()函數(shù),用于對(duì)每個(gè)字符串進(jìn)行分割和提取,并將其轉(zhuǎn)換為元組(a,b),其中a是不包含數(shù)字的字符串,b是數(shù)字字符串的轉(zhuǎn)換結(jié)果。然后,我們使用sorted()函數(shù)對(duì)字符串?dāng)?shù)組進(jìn)行排序,指定key=convert_text即可按照convert_text()函數(shù)的返回值進(jìn)行排序。
在這個(gè)示例中,我們使用了正則表達(dá)式來將數(shù)字和非數(shù)字字符分割開來,并對(duì)數(shù)字字符串進(jìn)行了轉(zhuǎn)換。這個(gè)方法不光適用于單個(gè)數(shù)字的字符串,也可以處理包含多個(gè)數(shù)字的字符串。
當(dāng)我們運(yùn)行代碼時(shí),輸出結(jié)果為:
普通函數(shù)雖然能夠解決這個(gè)自定義排序的問題,但是不簡潔,使用lambda會(huì)更加簡單,見以下代碼(原創(chuàng)):
運(yùn)行結(jié)果亦為:
可見,使用lambda一行代碼sorted(arr,key=lambda x: int(x[1:])) 即可高效解決問題。
5. 將字符串,按照字符中的數(shù)字進(jìn)行排序,另一案例
先看需要排序的數(shù)據(jù):
上圖,列表a中嵌套列表,請(qǐng)按照嵌套列表的第三項(xiàng)“S+數(shù)字”中的數(shù)字進(jìn)行排序。由于列表元素“S+數(shù)字”中的“數(shù)字”此時(shí)是字符串類型的數(shù)據(jù),必須先轉(zhuǎn)換成整數(shù)類型數(shù)據(jù),才能按數(shù)字排序,使用lambda可以快速實(shí)現(xiàn)目標(biāo),代碼如下(原創(chuàng)):
運(yùn)行結(jié)果:
使用lambda,又是一行代碼搞定。
以上內(nèi)容,對(duì)sorted()和lambda函數(shù)的組合應(yīng)用進(jìn)行了分析,希望對(duì)大家有所幫助。
參考文獻(xiàn):
https://www.runoob.com/python3/python3-func-sorted.html
https://www.cnblogs.com/kaishirenshi/p/8611358.html
https://www.cnblogs.com/huigebj/p/11433896.html
https://www.cnblogs.com/loveu123/p/12682480.html
https://baijiahao.baidu.com/s?id=1746742334772754606
https://deepinout.com/python/python-qa/t_how-to-correctly-sort-a-string-with-a-number-inside-in-python.html
注:本文藍(lán)色內(nèi)容為本人原創(chuàng)(轉(zhuǎn)載請(qǐng)注明出處),其他部分綜合整理自不同的網(wǎng)絡(luò)內(nèi)容,出處見參考文獻(xiàn)。