大家都知道,python排序有內置的排序函數 sort() 和 高階函數sorted() 。但是它們有什么區別呢?
讓我們先從這個函數的定義說起:
-
sorted():該函數第一個參數iterable為任意可以迭代的對象,cmp是比較函數,通常為lambda函數,key是用於比較的關鍵字,reverse表示排序結果是否反轉。
-
L.sort():該函數的三個參數和 sorted() 的后三個參數含義是一致的,而需要特別注意的是,該函數只適用於列表,而非任意可以迭代的對象。cmp是比較函數,接受兩個對象參數 x 和 y,返回 負數(x<y),0(x=y),正數(x>y)
L.sort() 這里需要注意的一點是,調用 L.sort() 完成排序后,改變了要排序的列表的結構
A = [3,6,1,5,4,2] A.sort() // [1, 2, 3, 4, 5, 6]
student = [['Tom', 'A', 20], ['Jack', 'C', 18], ['Andy', 'B', 11]] student.sort(key=lambda student: student[2]) 學生列表中包含列表,每個列表是學生的姓名、成績以及年齡,排序過程中指定了key為學生的年齡,所以排序的結果為:[['Andy', 'B', 11], ['Jack', 'C', 18], ['Tom', 'A', 20]]
student = [['Tom', 'A', 20], ['Jack', 'C', 18], ['Andy', 'B', 11]] student.sort(cmp=lambda x, y: x[2] - y[2])
通過定義 key 和 cmp 都可以完成排序,但是這兩者之間有什么區別呢?cmp傳入的函數在整個排序過程中會調用多次,因為會進行多次比較,所以函數調用開銷較大,因此使用 key 的效率比 cmp 的效率要高。
sorted() sorted()可以應用於任意的可以迭代的對象,所以應用范圍比L.sort() 廣泛的多,可以應用於字符串,元組,列表,字典等可迭代對象。
B = 'Python' sorted(B) C = (3, 6, 1, 5, 4, 2) sorted(C) D = [3, 6, 1, 5, 4, 2] sorted(D) E = {'1': 'a', '2': 'b', '0': 'c'} sorted(E.items())
需要注意的是,該函數會返回一個排序后的列表,原有可迭代對象保持不變,這與 L.sort() 函數不同。然而,這會浪費較大的存儲空間,尤其是數據量較大時。所以,在列表進行排序時,需要考慮是否需要保存原列表,如果無需保存原列表,則優先使用L.sort() 節省內存空間,提高效率。
有的排序可能需要根據兩個關鍵字,常用的比如單詞的排序,第一個字母相同然后根據第二個字母排序,Python中的 sorted() 函數是否支持這種實現呢?答案是肯定的,再設置 key 時指定多個屬性即可:
L = ['cat', 'binary', 'big', 'dog'] print sorted(L, key=lambda x: (x[0], x[1], x[2])) ['big', 'binary', 'cat', 'dog']
總結
-
L.sort() 函數只適用於列表排序,而sorted()函數適用於任意可以迭代的對象排序。
-
L.sort() 函數排序會改變原有的待排序列表,而sorted()函數則不會改變。所以在使用列表進行排序時,需要考慮是否需要保存原列表,如果無需保存原列表,則優先使用L.sort() 節省內存空間,提高效率。
-
兩個函數通過定義 key 和 cmp 都可以完成排序,但是 key 的效率要遠遠高於 cmp,所以要優先使用 key 。