先看下幫助文檔:>>> 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控制升序/降序。