Python3學習(13)--排序函數sorted

我們今天來說一說排序函數sorted,前面我們講過,我們可以使用sort()函數對一個list進行排序(但是我們對tuple就不行了,爲什麼呢,下面我們會複習到),這裏的sort和sorted是不一樣的,我們先來看一下,用help幫助函數輸出的兩個函數的解釋:

一、list.sort

我們前面學函數的時候,學過默認參數,下面我們就用這種方式來演示一下排序的兩種方式 reverse  True 或者 False:

 

(1)從小到大排序,默認就是reverse=False

 

(2)從大到小排序,不再給默認參數,我們讓reverse =True

 

總結:sort()函數,是針對list本身的,是發生在list內部序列上的排序,因此我們發現輸出L前後發生了變化,而list對象本來就是可變的,所以,不影響,但是tuple對象就不是了,所以,sort()這種排序不適合,不,是不針對tuple!

 

看完針對list的sort排序,我們再來看另一個排序函數sorted(本篇的主角):

 

二、sorted

 

以上,我們對這個sorted函數有了初步認識,但還沒用,所以,我們也不知道這個函數和sort比起來,是不是更優越一些,來吧,我們就測試一下

簡單的走起:‘

這個還是看不出來二者有什麼區別,唯一區別就是sorted排序後返回了一個新的list,別急,我們繼續走着:

我們知道sorted的第二個參數是一個關鍵字key,這個key指向一個函數並作用於可迭代的序列,這就是我們熟悉的高階函數,不同於我們學過的map,reduce和filter,sorted總過有三個參數,這點需要注意區分;下面,我們重新對一個序列進行排序,排序的規則是按照序列中的整數元素進行絕對值大小比較並降序排列,爲了區別sort,我們用tuple對象表示序列:

 

這個是比較數字的,如果我們比較的是str類型的呢?

其實比較字符串,就是比較字符串的首字母的ASCII碼,這個碼值是一個整數,整數是可以比較大小的,對於上面的L,我們來驗證一下,爲什麼會這麼排序,我們拿到四個單詞的首字母'B','D','J','K',分別用函數ord()得到ASCII碼值如下:

沒毛病,升序排的話,最後一個確實是Kobe,我們再想一下,Kobe 和 kobe哪個在前呢?我們先得到ASCII碼值:

由此可見,小寫的kobe應該排在後面:

 

通過上面的幾個例子,我們可以看出來,sorted相比sort來說:

a)、更加高級,更加抽象

b)、作用的對象,不再只是不可變的list了,而是可以迭代的對象,範圍比較廣了

c)、不會影響作用的可迭代的序列,序列一開始是什麼,sorted結束後,依然是什麼

 

以我的風格,sorted的講解,不可能到這就結束了,我們還需要繼續深挖,畢竟key指向的函數不可能都像abs那麼簡單,我們知道在SQL中,假設有這樣一個評分表,記錄着Kobe,James,Durant和Bob這四個人的綜合評分,我們假設查出來的數據如下:

當然,現在,我們有兩種排序法,一種是按姓名排,假設我們想要名字按升序來,我們可以用默認的來:

按成績來的話,我們當然需要成績高的排在前面,所以我們採用降序:

 

爲什麼講着講着Pyhon,我會扯到C++,java、C#或者其他語言呢,這不是無聊唆使,而是這樣可以避免無聊,還有個好處就是,這樣一對比,可以幫助我們更好的去理解Python某些函數的機制,更好的去使用它們;

 

扯回來,我們看下Python如何實現上述功能,首先,我們構造一個序列,序列中的元素是一個tuple對象(我們也可以採用字典dict,道理是一樣 ):

 L = [('Kobe',95),('James',90),('Durant',98),('Bob',85)]

我們把L當成一個表結構(二維數組),每一個tuple對象是一行,tuple元組中的每個元素代表每一列,現在我們想要對L這個序列進行排序,條件是按照姓名升序排:

我們用兩種方法實現,不用想,你應該能說出來是哪兩種了吧:

 

A、一般簡單函數實現key值的作用

B、lambda表達式實現key值的作用

這回我們不按Name來了,我們按成績降序排列:

 

我去,小插曲啊,這個錯告訴我們,不要過於自信在dos命令行下敲代碼,這個錯還告訴我們,你丫的,給你說了key不要拼寫錯了,誰叫你丫的連key都不寫了!

 

好吧,我們正常點:

 

可以了吧,lambda表達式夠可以的吧,是不是!?所以說呢,儘量熟練了以後,能用lambda表達式代替函數的就用它吧,就好比你明明有1張毛爺爺,你卻非要給對方換10張10塊的,按我說,你丫嫌零錢不夠多是吧,可能其他人會想,太好了,一張換十張,起碼錢包可以撐起來了。哈哈

 

 

結束語:

有時候,你帶着目的性去做一件事情,實施的時候你發現,事情遠沒有最初想的那麼簡單,怎麼辦:

半途而廢?  那就請你以後做事情的時候,不要帶有目的性,平常心去做,平常心收尾;

堅持到底?  那就希望你以後做每一件事情都帶有目的性,因爲這樣,你得到的會遠比你付出的要多。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章