Python list排序

jopen 10年前發布 | 18K 次閱讀 Python Python開發

一、 python提供的對list進行排序的方法

1、方法:

    (1)list的內建函數list.sort進行排序, 

    (2)用序列類型函數sorted(list)進行排序。

2、示例:

    >>> a_list = [2,5,4,3,1]
    >>> a_list
    [2, 5, 4, 3, 1]
    >>> sorted(a_list)
    [1, 2, 3, 4, 5]
    >>> a_list
    [2, 5, 4, 3, 1]
    >>> a_list.sort()
    >>> a_list
    [1, 2, 3, 4, 5]
    >>> 

3、說明:

    (1)sorted(list)返回一個對象,可以用作表達式。原來的list不變,生成一個新的排好序的list對象

    (2)list.sort()不會返回對象,改變原有的list

二、list.sort()方法的講解

1、

從Python2.4開始, sort方法有了三個可選的參數:cmp,key, reverse

Python Library Reference里這樣描述:

cmp:cmp specifies a custom comparison function of two arguments (iterable elements) which should return a negative, zero or positive number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument:
"cmp=lambda x,y: cmp(x.lower(), y.lower())"
key:key specifies a function of one argument that is used to extract a comparison key from each list element: "key=str.lower"
reverse:reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.In general, the key and reverse conversion processes are much faster than specifying an
equivalent cmp function. This is because cmp is called multiple times for each list element while key and reverse touch each element only once.

2、示例


實例1:
    >>>L = [2,3,1,4]
    >>>L.sort()
    >>>L
    >>>[1,2,3,4]
實例2:
    >>>L = [2,3,1,4]
    >>>L.sort(reverse=True)
    >>>L
    >>>[4,3,2,1]
實例3:對第二個關鍵字排序
    >>>L = [('b',6),('a',1),('c',3),('d',4)]
    >>>L.sort(lambda x,y:cmp(x[1],y[1]))
    >>>L
    >>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]
實例4: 對第二個關鍵字排序
    >>>L = [('b',6),('a',1),('c',3),('d',4)]
    >>>L.sort(key=lambda x:x[1])
    >>>L
    >>>[('a', 1), ('c', 3), ('d', 4), ('b', 6)]
實例5: 對第二個關鍵字排序
    >>>L = [('b',2),('a',1),('c',3),('d',4)]
    >>>import operator
    >>>L.sort(key=operator.itemgetter(1))
    >>>L
    >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
實例6:(DSU方法:Decorate-Sort-Undercorate)
    >>>L = [('b',2),('a',1),('c',3),('d',4)]
    >>>A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort
    >>>A.sort()
    >>>L = [s[2] for s in A]
    >>>L
    >>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
以上給出了6中對List排序的方法,其中實例3.4.5.6能起到對以List item中的某一項
為比較關鍵字進行排序.
效率比較:
cmp < DSU < key
通過實驗比較,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相當

多關鍵字比較排序:
實例7:
>>>L = [('d',2),('a',4),('b',3),('c',2)]
>>> L.sort(key=lambda x:x[1])
>>> L
>>>[('d', 2), ('c', 2), ('b', 3), ('a', 4)]
我們看到,此時排序過的L是僅僅按照第二個關鍵字來排的,

如果我們想用第二個關鍵字排過序后再用第一個關鍵字進行排序呢?有兩種方法
實例8:
    >>> L = [('d',2),('a',4),('b',3),('c',2)]
    >>> L.sort(key=lambda x:(x[1],x[0]))
    >>> L
    >>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
實例9:

    >>>import operator
    >>> L = [('d',2),('a',4),('b',3),('c',2)]
    >>> L.sort(key=operator.itemgetter(1,0))
    >>> L
    >>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]
為什么實例8能夠工作呢?原因在于tuple是的比較從左到右比較的,比較完第一個,如果
相等,比較第二個

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!