sort與sorted的區別及實例

描述

咱們須要對List進行排序,Python提供了兩個方法對給定的List L進行排序 : 方法1.用對List的成員函數sort進行排序方法2.用內置函數sorted進行排序(從2.4開始)java

sortedpython

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 customize the sort order, and the
   reverse flag can be set to request the result in descending order.

sortapp

sort() 函數用於對原列表進行排序,若是指定參數,則使用比較函數指定的比較函數函數

>>> help(list.sort)
Help on method_descriptor:

sort(...)
L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE*

參數說明ui

原型:sort(key,reverse=False)key:用來指定一個函數,此函數在每次元素比較時被調用,此函數表明排序的規則,也就是你按照什麼規則對你的序列進行排序;reverse:是用來代表是否逆序,默認的False狀況下是按照升序的規則進行排序的,當reverse=True時,便會按照降序進行排序。注;通常來講,cmp和key可使用lambda表達式spa

sort 與sorted的區別

sort()與sorted()的不一樣在於,sort是在原位從新排列列表,而sorted()是產生一個新的列表。code

sort 是應用在 list 上的方法,sorted 能夠對全部可迭代的對象進行排序操做。對象

list 的 sort 方法返回的是對已經存在的列表進行操做,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操做。排序

示例:

示例一

>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> a.sort()
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]

>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> sorted(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]
>>> a
[1, 2, 5, 3, 9, 4, 6, 8, 7, 0, 12]

 

區別:對於一個無序的列表a,調用a.sort(),對a進行排序後返回a,sort()函數修改待排序的列表內容。而對於一樣一個無序的列表a,調用sorted(a),對a進行排序後返回一個新的列表,而對a不產生影響。

示例二

假設用元組保存每個學生的信息,包括學號,姓名,年齡。用列表保存全部學生的信息。

>>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> list1.sort()
>>> list1
[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Logan', 20)]

>>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> sorted(list1)
[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Logan', 20)]
>>> list1
[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]

小結:由示例能夠看出,當列表由list(或者tuple)組成時,默認狀況下,sort和sorted都會根據list[0](或者tuple[0])做爲排序的key,進行排序。以上都是默認的排序方式,咱們能夠編寫代碼控制兩個函數的排序行爲。主要有三種方式:基於key函數;基於cmp函數和基於reverse函數

基於key函數排序

>>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> list1.sort(key=lambda x:x[2])
>>> list1
[(5, 'Lucy', 19), (8, 'Logan', 20), (2, 'Mike', 22)]

>>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> sorted(list1, key=lambda x:x[2])
[(5, 'Lucy', 19), (8, 'Logan', 20), (2, 'Mike', 22)]
>>> list1
[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]

基於reverse函數

>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> a.sort(reverse=False)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]

>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> a.sort(reverse=True)
>>> a
[12, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a.sort(reverse=True)

 

小結:reverse=False爲升序排序(默認);reverse=True爲降序排序

經典面試題

要求

a. 全部的正數排前面,全部的負數排後面 

b. 若是兩個數同是正數或者同是負數,那麼全部非浮點數排前面,全部浮點數排後面 

c. 若是兩個數正負數類型相同,是不是浮點數的結果也相同,那麼按兩個數的絕對值大小比較,絕對值小的排前面,絕對值大的排後面 

 

lis = [-13, 14, 5, 5, 18, -2, 13, 15, -3, 10, 9.43, -4.43, 4.57, 8.57, 9.57, -6.14, 2.29, 9.43, 4.14, -5.57] 
newlis = sorted(lis, key=lambda x: (x < 0, isinstance(x, float), abs(x))) 
print(newlis)

上面程序運行結果是:

[5, 5, 10, 13, 14, 15, 18, 2.29, 4.14, 4.57, 8.57, 9.43, 9.43, 9.57, -2, -3, -13, -4.43, -5.57, -6.14] 

在本例子中有一句 lambda x: (x < 0, isinstance(x, float), abs(x)),這其實就是 python 裏面的 lambda 表達式

1.什麼是 lambda 表達式

python 語言中,lambda 表達式就至關於一個只有一句代碼的函數:

lambda x: (x < 0, isinstance(x, float), abs(x)) 

至關於函數:

def fun(x): 
    return (x < 0, isinstance(x, float), abs(x)) 

這個函數返回的是一個元組

2.什麼是 sorted 函數

sorted 函數第一個參數是要排序的列表,默認會把列表中的元素從小到大進行排序 key 參數接受一個 Callable 對象,好比 lambda 表達式,key 默認值爲 None ;若是 key 參數爲 lambda 表達式,在對列表中每一個元素排序的時候,會執行 lambda 表達式的語句,根據 lambda 表達式的返回值,決定每一個元素的大小,這個例子裏,其實就是元組和元組比較大小,相似於 (True, False, 19) 和 (True, True, 10) 元組比較大小,默認小的排前面,大的排後面

3.元組大小如何比較

元組比較大小,實際上是比較元組中對應元素的大小 好比:

t1=(a1, a2, a3) 和 t2=(b1, b2, b3) 

先比較 a1 和 b1 的大小,若是 a1 > b1, 那麼 t1 > t2; 若是 a1 < b1,那麼 t1 < t2; 若是 a1 == a2, 那麼繼續比較第二個元素大小,元組的大小由第二個元素大小決定,若是第二個元素也相等,那麼比較第三個元素大小,依次類推。。。

4.本案例排序規則是什麼

lambda x: (x < 0, isinstance(x, float), abs(x)) 這個 lambda 表達式定義的排序規則是: a. 全部的正數排前面,全部的負數排後面 b. 若是兩個數同是正數或者同是負數,那麼全部非浮點數排前面,全部浮點數排後面 c. 若是兩個數正負數類型相同,是不是浮點數的結果也相同,那麼按兩個數的絕對值大小比較,絕對值小的排前面,絕對值大的排後面

好比 -5 和 2.3 比較大小 實際上是 (-5<0, isinstance(-5, float), abs(-5)) 和 (2.3<0, isinstance(2.3, float), abs(2.3)) 這兩個元組比較大小

(-5<0, isinstance(-5, float), abs(-5)) == (True, False, 5) 
(2.3<0, isinstance(2.3, float), abs(2.3)) == (False, True, 2.3) 

因此至關於

(True, False, 5) 和 (False, True, 2.3) 比較大小 

這兩個元組比較,(True, False, 5) 是大於 (False, True, 2.3) 的,因此排序的時候 2.3 排前面,-5 排後面。


sort與sorted的區別及實例

識別圖中二維碼,歡迎關注python寶典

相關文章
相關標籤/搜索