[轉(zhuǎn)]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ù)并且返回一個用于排序的值)作為關(guān)鍵字,有默認值,迭代集合中的一項。

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ù)復(fù)雜點的用法:假設(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)]

當(dāng)list由tuple組成時,默認情況下,sort和sorted都會根據(jù)tuplp[0]作為排序的key進行排序。當(dāng)然,我們完全可以控制它的排序行為:
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控制升序/降序。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容