python的sorted排序具體解釋


排序。在編程中常常遇到的算法。我也在幾篇文章中介紹了一些關於排序的算法。

有的高級語言內置了一些排序函數。本文講述Python在這方面的工作。供使用python的程序猿們參考,也讓沒有使用python的朋友了解python。

領略一番“生命有限,請用Python”的含義。


內置函數sorted()/list.sort()的使用


簡單應用


python對list有一個內置函數:sorted(),專門用於排序。

舉例:

>>> a=[5,3,6,1,9,2]
>>> sorted(a)       #a經過sorted之后。得到一個排序結果
[1, 2, 3, 5, 6, 9]  #可是,原有的a並沒有受到影響
>>> a
[5, 3, 6, 1, 9, 2]

也能夠使用list.sort()來進行上述操作。

>>> a.sort()
>>> a               #注意這里,經過list.sort()之后,原有
[1, 2, 3, 5, 6, 9]  #a的順序已經發生變化。與上述不同之處。

sorted和list.sort()的差別: list.sort()僅僅能對list類型進行排序。例如以下:

>>> b_dict={1:'e',3:'m',9:'a',5:'e'}
>>> b_dict.sort()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  AttributeError: 'dict' object has no attribute 'sort'

而sorted則不然。看樣例:

>>> b_dict
{1: 'e', 3: 'm', 5: 'e', 9: 'a'}
>>> sorted(b_dict)
[1, 3, 5, 9]

sorted之后。上述對dictinoary中,將key值取出並排序,返回list類型的排序結果。


依照指定關鍵詞排序


在list.sort()和sorted中,都能夠依據指定的key值排序。比如:

sorted的樣例:

>>> qw="I am Qiwsir you can read my articles im my blog".split()
>>> qw
['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']
>>> sorted(qw,key=str.lower)        #依照字母升序排列
['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

list.sort()的樣例:

>>> qw  
['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']
>>> qw.sort(key=str.lower)
>>> qw
['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

此外,key還能夠接收函數的單一返回值。依照該值排序。比如:

>>> name_mark_age = [('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16)]
>>> sorted(name_mark_age, key = lambda x: x[2])     #依據年齡排序
[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16)]

>>> sorted(name_mark_age, key = lambda x: x[1])     #依據等級排序
[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14)]

>>> sorted(name_mark_age, key = lambda x: x[0])     #依據姓名排序
[('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhangsan', 'A', 15)]

除了上述方式。python中還提供了一個選擇循環選擇指定元組值的模塊。官方文檔:https://docs.python.org/2/library/operator.html#module-operator

>>> from operator import itemgetter    

>>> name_mark_age
[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age,key=itemgetter(2))     #依照年齡排序
[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age,key=itemgetter(1,2))   #先依照等級排序,同樣等級看年齡
[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14), ('zhaoliu', 'B', 16)]

在官方文檔上。有這樣一個樣例,和上面的操作是全然一樣的。

>>> class Student:
        def __init__(self, name, grade, age):
            self.name = name
            self.grade = grade
            self.age = age

        def __repr__(self):
            return repr((self.name, self.grade, self.age))

>>> student_objects = [
        Student('john', 'A', 15),       #注意這里,用class Student來生成列表內的值
        Student('jane', 'B', 12),       #因此,能夠通過student_objects[i].age來訪問某個名稱的年齡,i=0,則是john的年齡
        Student('dave', 'B', 10),
        ]

>>> sorted(student_objects, key=lambda student: student.age)
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

也能夠引用operator模塊來實現上述排序

>>>from operator import attrgetter
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

**總結:**sorted的能力超強,不僅實現排序,還能依照指定關鍵詞排序。



以上樣例都是升序。假設,添加reverse=True。比如:

>>>from operator import itemgetter 
>>> name_mark_age
[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]
>>> sorted(name_mark_age, key=itemgetter(2),reverse=True)
[('WANGWU', 'A', 16), ('zhaoliu', 'B', 16), ('zhangsan', 'A', 15), ('LISI', 'B', 14)]

sorted的算法


python中的sorted算法。網上有人撰文,說比較低級。事實上不然,通過閱讀官方文檔。發現python中的sorted排序。真的是高大上,用的Timsort算法。什么是Timsort,請看 wiki的解釋:http://en.wikipedia.org/wiki/Timsort,另外,國內有一個文檔,適當翻譯:http://blog.csdn.net/yangzhongblog/article/details/8184707。這里截取一個不同排序算法比較的圖示。就明確sorted的威力了。



從時間復雜度來看,Timsort是威武的。

從空間復雜度來講,須要的開銷在數量大的時候會增大。

綜上,能夠看出,就普通情況。使用sorted足以能夠完畢排序的要求。而且是穩定的。

當然,python中也有其他一些排序模塊。都能夠直接拿過來使用。

本文作者在博客和github上都有多種關於python排序方法和模塊的文章說明。


免責聲明!

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



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