python之排序(sort/sorted)


        大家都知道,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 。

 


免責聲明!

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



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