923|sorted

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318230588782cac105d0d8a40c6b450a232748dc854000

排序算法

排序也是在程序中經(jīng)常用到的算法婆翔。無論使用冒泡排序還是快速排序,排序的核心是比較兩個元素的大小侨舆。如果是數(shù)字雁竞,我們可以直接比較佳头,但如果是字符串或者兩個dict呢氮惯?直接比較數(shù)學(xué)上的大小是沒有意義的襟士,因此览爵,比較的過程必須通過函數(shù)抽象出來慷嗜。通常規(guī)定淀弹,對于兩個元素x和y,如果認為x < y庆械,則返回-1薇溃,如果認為x == y,則返回0缭乘,如果認為x > y沐序,則返回1,這樣堕绩,排序算法就不用關(guān)心具體的比較過程策幼,而是根據(jù)比較結(jié)果直接排序。

Python內(nèi)置的sorted()函數(shù)就可以對list進行排序:

>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

此外奴紧,sorted()函數(shù)也是一個高階函數(shù)特姐,它還可以接收一個key函數(shù)來實現(xiàn)自定義的排序,例如按絕對值大小排序:

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

key指定的函數(shù)將作用于list的每一個元素上黍氮,并根據(jù)key函數(shù)返回的結(jié)果進行排序唐含。對比原始的list和經(jīng)過key=abs處理過的list:

key 也可以指定根據(jù)列表里面,元組中的某個因素來排序(見習(xí)題)

我們再看一個字符串排序的例子:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']

默認情況下沫浆,對字符串排序捷枯,是按照ASCII的大小比較的,由于'Z' < 'a',結(jié)果,大寫字母Z會排在小寫字母a的前面砚哆。

現(xiàn)在惊来,我們提出排序應(yīng)該忽略大小寫攀痊,按照字母序排序桐腌。要實現(xiàn)這個算法,不必對現(xiàn)有代碼大加改動苟径,只要我們能用一個key函數(shù)把字符串映射為忽略大小寫排序即可哩掺。忽略大小寫來比較兩個字符串,實際上就是先把字符串都變成大寫(或者都變成小寫)涩笤,再比較。

這樣盒件,我們給sorted傳入key函數(shù)蹬碧,即可實現(xiàn)忽略大小寫的排序:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)
['about', 'bob', 'Credit', 'Zoo']

要進行反向排序,不必改動key函數(shù)炒刁,可以傳入第三個參數(shù)r
everse=True:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

從上述例子可以看出恩沽,高階函數(shù)的抽象能力是非常強大的,而且翔始,核心代碼可以保持得非常簡潔罗心。
小結(jié)

sorted()也是一個高階函數(shù)。用sorted()排序的關(guān)鍵在于實現(xiàn)一個映射函數(shù)城瞎。

練習(xí)

假設(shè)我們用一組tuple表示學(xué)生名字和成績:

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
請用sorted()對上述列表分別按名字排序:

https://github.com/miaozaiye/python-learning/blob/master/923.py

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渤闷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脖镀,更是在濱河造成了極大的恐慌飒箭,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜒灰,死亡現(xiàn)場離奇詭異弦蹂,居然都是意外死亡,警方通過查閱死者的電腦和手機强窖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門凸椿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翅溺,你說我怎么就攤上這事脑漫。” “怎么了未巫?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵窿撬,是天一觀的道長。 經(jīng)常有香客問我叙凡,道長劈伴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮跛璧,結(jié)果婚禮上严里,老公的妹妹穿的比我還像新娘。我一直安慰自己追城,他們只是感情好刹碾,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著座柱,像睡著了一般迷帜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上色洞,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天戏锹,我揣著相機與錄音,去河邊找鬼火诸。 笑死锦针,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的置蜀。 我是一名探鬼主播奈搜,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼盯荤!你這毒婦竟也來了馋吗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤秋秤,失蹤者是張志新(化名)和其女友劉穎耗美,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體航缀,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡商架,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了芥玉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛇摸。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灿巧,靈堂內(nèi)的尸體忽然破棺而出赶袄,到底是詐尸還是另有隱情,我是刑警寧澤抠藕,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布饿肺,位于F島的核電站,受9級特大地震影響盾似,放射性物質(zhì)發(fā)生泄漏敬辣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溉跃。 院中可真熱鬧村刨,春花似錦、人聲如沸撰茎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽龄糊。三九已至逆粹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炫惩,已是汗流浹背枯饿。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诡必,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓搔扁,卻偏偏與公主長得像爸舒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稿蹲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容