Python 內置函數sorted()在高級用法


  1. 對於Python內置函數sorted(),先拿來跟list(列表)中的成員函數list.sort()進行下對比。在本質上,list的排序和內建函數sorted的排序是差不多的,連參數都基本上是一樣的。
    主要的區別在於,list.sort()是對已經存在的列表進行操作,進而可以改變進行操作的列表。而內建函數sorted返回的是一個新的list,而不是在原來的基礎上進行的操作.

  2. 再來,讓我們用Python自帶的幫助函數help()看看對於sorted()是怎么定義的:

     >>>help(sorted)
     
     Help on built-in function sorted in module builtins:
     sorted(iterable, key=None, reverse=False)
         Return a new list containing all items from the iterable in ascending order.
         
         A custom key function can be supplied to customise the sort order, and the
         reverse flag can be set to request the result in descending order.
    

要先說明的是, 本人用的Python版本為3.5, 所以會跟Python2的有變差。

由幫助可以看到,傳進去一個可迭代的數據,返回一個新的列表,注意,是新的列表!來看看看實例吧:

>>>g=[1,4,6,8,9,3,5]
>>>sorted(g)
Out[30]: [1, 3, 4, 5, 6, 8, 9]

>>>sorted((1,4,8,9,3,6))
Out[33]: [1, 3, 4, 6, 8, 9]

>>>sorted('gafrtp')
Out[35]: ['a', 'f', 'g', 'p', 'r', 't']

由以上可以看到,只要是可迭代對象數據,都能夠進行排序,生成一個排序后的列表。

  1. 如果想要排逆序呢?很簡單,只要將可選參數reverse設置為True即可:

     >>>sorted((1,4,8,9,3,6), reverse=True)
     Out[36]: [9, 8, 6, 4, 3, 1]
    

高級用法

有時候,我們要處理的數據內的元素不是一維的,而是二維的甚至是多維的,那要怎么進行排序呢?這時候,sorted()函數內的key參數就派上用場了!從幫助信息上可以了解到,key參數可傳入一個自定義函數。那么,該如何使用呢?讓我們看看如下代碼:

>>>l=[('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
>>>sorted(l, key=lambda x:x[0])
Out[39]: [('a', 1), ('b', 2), ('c', 6), ('d', 4), ('e', 3)]
>>>sorted(l, key=lambda x:x[0], reverse=True)
Out[40]: [('e', 3), ('d', 4), ('c', 6), ('b', 2), ('a', 1)]
>>>sorted(l, key=lambda x:x[1])
Out[41]: [('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]
>>>sorted(l, key=lambda x:x[1], reverse=True)
Out[42]: [('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)]

這里,列表里面的每一個元素都為二維元組,key參數傳入了一個lambda函數表達式,其x就代表列表里的每一個元素,然后分別利用索引返回元素內的第一個和第二個元素,這就代表了sorted()函數利用哪一個元素進行排列。而reverse參數就如同上面講的一樣,起到逆排的作用。默認情況下,reverse參數為False

當然,正如一開始講到的那樣,如果想要對列表直接進行排序操作,可以用成員方法sort()來做:

>>>l.sort(key=lambda x : x[1])
>>>l
Out[45]: [('a', 1), ('b', 2), ('e', 3), ('d', 4), ('c', 6)]
>>>l.sort(key=lambda x : x[1], reverse=True)
>>>l
Out[47]: [('c', 6), ('d', 4), ('e', 3), ('b', 2), ('a', 1)]

對於三維及以上的數據排排序,上述方法同樣適用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM