-
對於
Python
內置函數sorted()
,先拿來跟list(列表)中的成員函數list.sort()
進行下對比。在本質上,list的排序和內建函數sorted的排序是差不多的,連參數都基本上是一樣的。
主要的區別在於,list.sort()
是對已經存在的列表進行操作,進而可以改變進行操作的列表。而內建函數sorted
返回的是一個新的list,而不是在原來的基礎上進行的操作. -
再來,讓我們用
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, 所以會跟Python
2的有變差。
由幫助可以看到,傳進去一個可迭代的數據,返回一個新的列表,注意,是新的列表!來看看看實例吧:
>>>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']
由以上可以看到,只要是可迭代對象數據,都能夠進行排序,生成一個排序后的列表。
-
如果想要排逆序呢?很簡單,只要將可選參數
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)]
對於三維及以上的數據排排序,上述方法同樣適用。