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=b 34 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 自定义比较函数
比较函数类似于制定了比较规则。