[轉]Python容器排序sort()與sorted()的區(qū)別與分析

先看下幫助文檔:>>> help(list.sort)

Help on method_descriptor:

sort(...)
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
cmp(x, y) -> -1, 0, 1

>>> help(sorted)
Help on built-in function sorted in module __builtin__:

sorted(...)
    sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list

簡單解釋一下兩函數(shù):
sort(cmp=None, key=None, reverse=False)
sorted(iterable, cmp=None, key=None, reverse=False)

sort是容器的函數(shù)础锐,sorted是Python的內(nèi)建函數(shù)相同的參數(shù)。

cmp:用于比較的函數(shù)伍派,比較什么由key決定,有默認值鸭你,迭代集合中的一項屈张。cmp(e1, e2) 是帶兩個參數(shù)的比較函數(shù), 返回值:
負數(shù): e1 < e2,
0: e1 == e2,
正數(shù): e1 > e2擒权。
默認為 None, 即用內(nèi)建的比較函數(shù)。

key:用列表元素的某個已命名的屬性或函數(shù)(只有一個參數(shù)并且返回一個用于排序的值)作為關鍵字阁谆,有默認值碳抄,迭代集合中的一項。

reverse:排序規(guī)則场绿,reverse = True 或者 reverse = False剖效,有默認值。

sorted多一個參數(shù)iterable:

待排序的可迭代類型的容器看下兩函數(shù)簡單的用法(也是最本質(zhì)的區(qū)別):

>>> a=[1,3,5,2,9,4,7,8,6,0]
>>> a.sort()
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a=[1,3,5,2,9,4,7,8,6,0]
>>> sorted(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a
[1, 3, 5, 2, 9, 4, 7, 8, 6, 0]

對于一個無序的列表a焰盗,調(diào)用a.sort()璧尸,對a進行排序后返回a。
而對于同樣一個無序的列表a熬拒,調(diào)用sorted(a)爷光,對a進行排序后返回一個新的列表,而對a不產(chǎn)生影響梦湘。

接著看下兩函數(shù)復雜點的用法:假設用一個tuple保存每一個員工的信息瞎颗,包括工號,姓名捌议,年齡哼拔。用一個list保存所有的員工信息。

>>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
>>> list1.sort()
>>> list1
[(4, 'wutenglan', 30), (6, 'cangjingkong', 20), (7, 'boduoyejiyi', 25)]
>>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
>>> sorted(list1)
[(4, 'wutenglan', 30), (6, 'cangjingkong', 20), (7, 'boduoyejiyi', 25)]
>>> list1
[(6, 'cangjingkong', 20), (4, 'wutenglan', 30), (7, 'boduoyejiyi', 25)]

當list由tuple組成時瓣颅,默認情況下倦逐,sort和sorted都會根據(jù)tuplp[0]作為排序的key進行排序。當然宫补,我們完全可以控制它的排序行為:
1.基于key函數(shù)排序:

>>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
>>> list1.sort(key=lambda employee : employee[2])
>>> list1
[(6, 'cangjingkong', 20), (7, 'boduoyejiyi', 25), (4, 'wutenglan', 30)]
>>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
>>> sorted(list1,key=lambda employee : employee[2])
[(6, 'cangjingkong', 20), (7, 'boduoyejiyi', 25), (4, 'wutenglan', 30)]
>>> list1
[(6, 'cangjingkong', 20), (4, 'wutenglan', 30), (7, 'boduoyejiyi', 25)]

此時檬姥,list根據(jù)員工年齡排序。

2.基于cmp函數(shù)排序:

>>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
>>> list1.sort(cmp=lambda x,y : cmp(x[1],y[1]))
>>> list1
[(7, 'boduoyejiyi', 25), (6, 'cangjingkong', 20), (4, 'wutenglan', 30)]
>>> list1=[(6,'cangjingkong',20),(4,'wutenglan',30),(7,'boduoyejiyi',25)]
>>> sorted(list1,cmp=lambda x,y : cmp(x[1],y[1]))
[(7, 'boduoyejiyi', 25), (6, 'cangjingkong', 20), (4, 'wutenglan', 30)]
>>> list1
[(6, 'cangjingkong', 20), (4, 'wutenglan', 30), (7, 'boduoyejiyi', 25)]

此時粉怕,list根據(jù)員工姓名排序健民。

3.基于升序/降序排序:

>>> a=[1,3,5,2,9,4,7,8,6,0]
>>> a.sort(reverse=False)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a.sort(reverse=Ture)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Ture' is not defined
>>> a=[1,3,5,2,9,4,7,8,6,0]
>>> a.sort(reverse=False)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a=[1,3,5,2,9,4,7,8,6,0]
>>> a.sort(reverse=True)
>>> a
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a=[1,3,5,2,9,4,7,8,6,0]
>>> sorted(a,reverse=False)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> sorted(a,reverse=True)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a
[1, 3, 5, 2, 9, 4, 7, 8, 6, 0]

通過參數(shù)reverse控制升序/降序。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贫贝,一起剝皮案震驚了整個濱河市秉犹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稚晚,老刑警劉巖崇堵,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異客燕,居然都是意外死亡鸳劳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門也搓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赏廓,“玉大人涵紊,你說我怎么就攤上這事♂C” “怎么了栖袋?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抚太。 經(jīng)常有香客問我,道長昔案,這世上最難降的妖魔是什么尿贫? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮踏揣,結果婚禮上庆亡,老公的妹妹穿的比我還像新娘。我一直安慰自己捞稿,他們只是感情好又谋,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著娱局,像睡著了一般彰亥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衰齐,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天任斋,我揣著相機與錄音,去河邊找鬼耻涛。 笑死废酷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的抹缕。 我是一名探鬼主播澈蟆,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卓研!你這毒婦竟也來了趴俘?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤鉴分,失蹤者是張志新(化名)和其女友劉穎哮幢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體志珍,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡橙垢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了伦糯。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柜某。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗽元,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出喂击,到底是詐尸還是另有隱情剂癌,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布翰绊,位于F島的核電站佩谷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏监嗜。R本人自食惡果不足惜谐檀,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裁奇。 院中可真熱鬧桐猬,春花似錦、人聲如沸刽肠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽音五。三九已至惫撰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間躺涝,已是汗流浹背润绎。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诞挨,地道東北人莉撇。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像惶傻,于是被迫代替她去往敵國和親棍郎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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