Python_sort函數結合functools.cmp_to_key(func)分析
舉例如下:
1 from functools import cmp_to_key 2 persons = [ 3 { 4 ‘name‘:‘zhangsan‘, 5 ‘age‘:20, 6 ‘grade‘:98 7 }, 8 { 9 ‘name‘:‘lisi‘, 10 ‘age‘:18, 11 ‘grade‘: 88 12 }, 13 { 14 ‘name‘:‘wangwu‘, 15 ‘age‘:20, 16 ‘grade‘: 20 17 }, 18 { 19 ‘name‘: ‘yanqing‘, 20 ‘age‘: 15, 21 ‘grade‘: 20 22 }, 23 { 24 ‘name‘: ‘awu‘, 25 ‘age‘: 20, 26 ‘grade‘: 20 27 }, 28 ] 29 30 def cmp(a,b): 31 # 如果返回的是一個大於0的值,那麽代表a>b 32 # 如果返回的是一個小於0的值,那麽代表a<b 33 # 如果返回的是一個等於0的值,那麽代表a=b34 if a[‘grade‘] > b[‘grade‘]: 35 return 1 36 37 elif a[‘grade‘] < b[‘grade‘]: 38 return -1 39 else: 40 if a[‘age‘] > b[‘age‘]: 41 return 1 42 elif a[‘age‘] < b[‘age‘]: 43 return -1 44 else: 45 if a[‘name‘] > b[‘name‘]: 46 return 1 47 else: 48 return -1 49 persons.sort(key=cmp_to_key(cmp)) 50 new_persons = sorted(persons,key=cmp_to_key(cmp)) 51 print(persons) 52 print(new_persons)
針對sort(key=cmp_to_key(cmp))及函數cmp所產生的作用嘗試分析。
如下:
Sort(*,key=None,reverse = False)
sort()接受兩個只能通過關鍵字傳遞的參數(關鍵字參數):
key指定一個參數的函數,該函數用於從每個列表元素中提取一個比較鍵(例如,key=str.lower)。對列表中每個項對應的鍵計算一次,然後用於整個排序過程。None的默認值意味著列表項是直接排序的,不需要計算單獨的鍵值。
可以使用functools.cmp_to_key()實用程序來轉換2。將cmp函數樣式設置為關鍵函數。
functools.
cmp_to_key
(func )
將舊式比較函數(old-style comparison function)轉換為關鍵函數(key function)。使用接受關鍵函數的工具(如sorted()
,min()
, max()
,heapq.nlargest()
,heapq.nsmallest()
, itertools.groupby()
)。此函數主要用作從Python 2轉換的程序的轉換工具,它支持使用比較函數。
比較函數是任何可調用的,它接受兩個參數,對它們進行比較,並返回一個負數表示小於,零表示相等,或者一個正數表示大於。鍵函數是一個可調用的函數,它接受一個參數並返回另一個值作為排序鍵使用。
key function
關鍵函數或排序函數是可調用的,它返回用於排序或排序的值。例如,使用local .strxfrm()生成一個排序鍵,該鍵知道特定於區域設置的排序約定。
Python中的許多工具接受關鍵函數來控制元素的排序或分組方式(A number of tools in Python accept key functions to control how elements are ordered or grouped)。它們包括min()
,max()
, sorted()
,list.sort()
,heapq.merge()
, heapq.nsmallest()
,heapq.nlargest()
,和 itertools.groupby()
。
有幾種方法可以創建關鍵函數。為例。low()方法可以作為區分大小寫排序的關鍵函數。或者,可以從一個lambda表達式構建一個關鍵函數,例如r:(r[0], r[2])。此外,運算符模塊還提供了三個關鍵的函數構造函數:attrgetter()、itemgetter()和methodcaller()。
最後總結:
# sort是對列表進行排序
# key 主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可叠代對象中,指定可叠代對象中的一個元素來進行排序,每次排序前調用
# cmp_to_key 將比較函數轉換為關鍵字函數
# cmp 自定義比較函數
比較函數類似於制定了比較規則。
Python_sort函數結合functools.cmp_to_key(func)分析