定義:
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可免費白嫖