Python小白干貨寶典:sorted()函數(shù):列表元素排序

定義:

sorted() 函數(shù)對所有可迭代的對象進行排序操作持际。

內(nèi)建函數(shù) sorted 方法返回的是一個新的 list哗咆,而不是在原來的基礎(chǔ)上進行的操作岳枷。

語法:

sorted 語法:

sorted(iterable, cmp=None, key=None, reverse=False)

返回值:返回重新排序的列表空繁。

參數(shù)說明:

  • iterable -- 可迭代對象

  • cmp -- 比較的函數(shù)闷祥,這個具有兩個參數(shù)凯砍,參數(shù)的值都是從可迭代對象中取出拴竹,此函數(shù)必須遵守的規(guī)則為,大于則返回1座泳,小于則返回-1挑势,等于則返回0啦鸣。

  • key -- 主要是用來進行比較的元素,只有一個參數(shù)香拉,具體的函數(shù)的參數(shù)就是取自于可迭代對象中,指定可迭代對象中的一個元素來進行排序考传。無論是 sort() 還是 sorted() 函數(shù)僚楞,傳入?yún)?shù) key 比傳入?yún)?shù) cmp 效率要高枉层。

  • reverse -- 排序規(guī)則鸟蜡,reverse = True 降序 , reverse = False 升序(默認(rèn))跳座。

cmp()函數(shù)用于比較2個對象泣矛,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1

語法:

cmp( x, y )

參數(shù):

  • x -- 數(shù)值表達式您朽。

  • y -- 數(shù)值表達式哗总。

reverse()函數(shù):用于反向列表中元素。

語法:

list.reverse()

該方法沒有返回值蛋哭,但是會對列表的元素進行反向排序具壮。

sorted 的使用方法:

1哈蝇、默認(rèn)情況下炮赦,sorted 函數(shù)將按列表升序進行排序样勃,并返回一個新列表對象性芬,原列表保持不變植锉,最簡單的排序峭拘。

nums = [3,4,5,2,1]>>> sorted(nums)[1, 2, 3, 4, 5]

2鸡挠、降序排序拣展,如果要按照降序排列,只需指定參數(shù) reverse=True 即可

sorted(nums, reverse=True)[5, 4, 3, 2, 1]

3备埃、如果要按照某個規(guī)則排序按脚,則需指定參數(shù)key, key 是一個函數(shù)對象望众,例如字符串構(gòu)成的列表烂翰,我想按照字符串的長度來排序

chars = ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']>>> sorted(chars, key=len)['a', 'is', 'from', 'test', 'This', 'Andrew', 'string']

len是內(nèi)建函數(shù)甘耿,sorted 函數(shù)在排序的時候會用len去獲取每個字符串的長度來排序竿滨。 有些人可能使用匿名函數(shù) key=lambda x: len(x) 于游,

4贰剥、如果是一個復(fù)合的列表結(jié)構(gòu),例如由元組構(gòu)成的列表前痘,要按照元組中的第二個元素排序,那么可以用 lambda 定義一個匿名函數(shù)坯癣。

students = [('zhang', 'A'), ('li', 'D'), ('wang', 'C')]>>> sorted(students, key=lambda x: x[1])[('zhang', 'A'), ('wang', 'C'), ('li', 'D')]

這里將按照字母 A-C-D 的順序排列坡锡。

如果要排序的元素是自定義類鹉勒,例如Student類按照年齡來排序禽额,則可以寫成

a = [5,7,6,3,4,1,2]>>> b = sorted(a) # 保留原列表>>> a [5, 7, 6, 3, 4, 1, 2]>>> b[1, 2, 3, 4, 5, 6, 7] >>> L=[('b',2),('a',1),('c',3),('d',4)]>>> sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函數(shù)[('a', 1), ('b', 2), ('c', 3), ('d', 4)]>>> sorted(L, key=lambda x:x[1]) # 利用key[('a', 1), ('b', 2), ('c', 3), ('d', 4)] >>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]>>> sorted(students, key=lambda s: s[2]) # 按年齡排序[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] >>> sorted(students, key=lambda s: s[2], reverse=True) # 按降序[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]>>>

6脯倒、和數(shù)據(jù)庫的排序一樣藻丢,sorted 也可以根據(jù)多個字段來排序摄乒,例如我有先要根據(jù)age排序,如果age相同的則根據(jù)grade排序斋否,則可以使用元組:

sorted(student_objects, key=lambda t:(t.age, t.grade))[('dave', 'B', 10), ('lily', 'A', 12), ('jane', 'B', 12), ('john', 'A', 15)]

7茵臭、同樣的舅世,對于自定義類雏亚,也有一種更高效的方法指定key

from operator import attrgetter>>> sorted(student_objects, key=attrgetter('age'))[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

如果參與排序的字段有兩個怎么辦?

sorted(student_objects, key=attrgetter('grade', 'age'))[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

8追葡、前面碰到的排序場景都是建立在兩個元素是可以互相比較的前提下宜肉,例如數(shù)值按大小比較翎碑, 字母按順序比較日杈。

如果遇到本身是不可比較的莉擒,需要我們自己來定義比較規(guī)則的情況如何處理呢涨冀?

nums = [2, 1.5, 2.5, '2', '2.5']>>> sorted(nums)TypeError: '<' not supported between instances of 'str' and 'int'

一個整數(shù)列表中鹿鳖,可能有數(shù)字翅帜,字符串,在Python3中涝滴,字符串與數(shù)值是不能比較的绣版,而Python2中任何類型都可以比較,這是兩個版本中一個很大的區(qū)別:

python2>>> "2.5" > 2True# python3>>> "2.5" > 2TypeError: '>' not supported between instances of 'str' and 'int'

9歼疮、關(guān)于 sorted 函數(shù)僵娃,當(dāng)遇到需要自定義比較操作的數(shù)據(jù),Python2和Python3之間的區(qū)別是:

Python2中的sorted 可以指定cmp關(guān)鍵字參數(shù)腋妙,可以通過 cmp=compare 來實現(xiàn)默怨,

Python3中還需要導(dǎo)入functools.cmp_to_key實現(xiàn)

sorted()函數(shù)使用范圍:

  • 對字典進行排序(中根據(jù)字典的值進行排序)

  • 多維list排序

  • 字典中混合list排序

  • List 中混合字典排序

  • 對字符串進行排序

sort()與sorted()的區(qū)別

1、相比于 sort()骤素,sorted() 使用的范圍更為廣泛匙睹,兩者的函數(shù)形式分別如下:

sorted(iterable[, cmp[, key[, reverse]]]) s.sort([cmp[, key[, reverse]]])

2、sorted() 作用于任意可迭代的對象济竹,而 sort()一般作用于列表痕檬。

a = (1,2,4,2,3)>>> a.sort()Traceback (most recent call last): File "<stdin>", line 1, in <module>AttributeError: 'tuple' object has no attribute 'sort'>>> sorted(a)[1, 2, 2, 3, 4]

下面的例子中針對元組使用 sort() 方法會拋出 AttributeError唁桩,而使用 sorted() 函數(shù)則 沒有這個問題报辱。

3、當(dāng)排序?qū)ο鬄榱斜淼臅r候兩者適合的場景不同。sorted() 函數(shù)會返回一個排序后的列表,原有列表保持不變一睁;而 sort() 函數(shù)會直接修改原有列表饲帅,永久改變,無法返回,函數(shù)返回為 None按声。

a=['1',1,'a',3,7,'n']>>> sorted(a)[1, 3, 7, '1', 'a', 'n']>>> a['1', 1, 'a', 3, 7, 'n']>>> print a.sort()None>>> a[1, 3, 7, '1', 'a', 'n']

如果實際應(yīng)用過程中需要保留原有列表铐料,使用 sorted() 函數(shù)較為適合族阅,否則可以選擇sort() 函數(shù)举塔,因為 sort() 函數(shù)不需要復(fù)制原有列表计盒,消耗的內(nèi)存較少拔第,效率也較高懈涛。

點擊666可免費白嫖

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拷呆,隨后出現(xiàn)的幾起案子手形,更是在濱河造成了極大的恐慌,老刑警劉巖罢防,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绽昼,居然都是意外死亡菱农,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門舅巷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搁凸,“玉大人嫡良,你說我怎么就攤上這事。” “怎么了浪藻?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵辆雾,是天一觀的道長。 經(jīng)常有香客問我拴念,道長万搔,這世上最難降的妖魔是什么揽浙? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮剧劝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘取胎。我一直安慰自己,他們只是感情好役衡,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布榕莺。 她就那樣靜靜地躺著唠雕,像睡著了一般揣云。 火紅的嫁衣襯著肌膚如雪汪榔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天区岗,我揣著相機與錄音,去河邊找鬼毁枯。 笑死慈缔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的种玛。 我是一名探鬼主播藐鹤,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼瓤檐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了娱节?” 一聲冷哼從身側(cè)響起挠蛉,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肄满,沒想到半個月后碌秸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡悄窃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年讥电,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轧抗。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡恩敌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出横媚,到底是詐尸還是另有隱情纠炮,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布灯蝴,位于F島的核電站恢口,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏穷躁。R本人自食惡果不足惜耕肩,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望问潭。 院中可真熱鬧猿诸,春花似錦、人聲如沸狡忙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灾茁。三九已至窜觉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間北专,已是汗流浹背禀挫。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逗余,地道東北人特咆。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親腻格。 傳聞我的和親對象是個殘疾皇子画拾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

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