1. 程式人生 > >sorted 使用 lambda 排序案例

sorted 使用 lambda 排序案例

list1=[7, -8, 5, 4, 0, -2, -5]
print(sorted(list1,key=lambda x:(x<0,abs(x))))

執行結果如下:

[0, 4, 5, 7, -2, -5, -8]

本例中使用的 lambda ,可以改寫成函式形式,執行結果完全一樣:

def fun(x):
    return (x<0, abs(x))
print(sorted(list1, key=fun))

 

1、什麼是 sorted 函式 ?

sorted(iterable, *, key=None, reverse=False)
  • sorted 函式第一個引數是要排序的列表,預設會把列表中的元素從小到大進行排序 。
  • key 引數是一個可呼叫物件(key要的函式而不是呼叫結果,比如 lambda 表示式),key 預設值為 None ;如果 key 引數為 lambda 表示式,在對列表中每個元素排序的時候,會執行 lambda 表示式的語句,根據 lambda 表示式的返回值,決定每個元素的大小。這個例子裡,其實就是元組和元組比較大小。
  • reverse 引數是排序規則,reverse = True 降序 , reverse = False 升序(預設)。

相比於 sort() 函式,sort() 是 list 列表中的函式,並且 sort() 函式是內建函式,會改變當前物件,而 sorted() 函式只會返回一個排序後的當前物件的副本,而不會改變當前物件。

 

2、元組間比較大小。

按照各個元素之間的大小進行比較,比如t1 = (a1, a2, a3) 和 t2 = (b1, b2, b3)

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

 

3、本案例的排序規則是什麼?

lambda x:(x<0,abs(x))
  • lambda 返回的是一個元組。比如:當 x 是 7 的時候 lambda 執行的結果為 (False, 7),當 x 是 -8 的時候,結果為(True, 8)。
  • 所有大於 0 的數排在前面,所有小於 0 的數排在後面。因為這個數小於 0 的時候,x < 0 為 True;這個數大於 0 的時候,x < 0 為 False。又因為 False < True。按照預設的規則,小的在前面,大的在後面,所以所有大於 0 的數排在前面,所有小於 0 的數排在後面。
  • 如果元組的第一位相同,那麼再用元組的第二位來比較,絕對值小的在前面,絕對值大的在後面。

 

綜上所述,當 7 和 -8 比較的時候,相當於是  (False, 7) 和 (True, 8) 做比較。先是 False 和 True 做比較,False 在前面,所以 7 在前面 ,-8 在後面。