Python_sort函数结合functools.cmp_to_key(func)分析

举例如下:

1 1 from functools import cmp_to_key 2 2 persons = [ 3 3 { 4 4 'name':'zhangsan', 5 5 'age':20, 6 6 'grade':98 7 7 }, 8 8 { 9 9 'name':'lisi', 1010 'age':18, 1111 'grade': 88 1212 }, 1313 { 1414 'name':'wangwu', 1515 'age':20, 1616 'grade': 20 1717 }, 1818 { 1919 'name': 'yanqing', 2020 'age': 15, 2121 'grade': 20 2222 }, 2323 { 2424 'name': 'awu', 2525 'age': 20, 2626 'grade': 20 2727 }, 2828 ] 2929 3030 def cmp(a,b): 3131 # 如果返回的是一个大于0的值,那么代表a>b 3232 # 如果返回的是一个小于0的值,那么代表a<b 3333 # 如果返回的是一个等于0的值,那么代表a=b 3434 if a['grade'] > b['grade']: 3535 return 1 3636 3737 elif a['grade'] < b['grade']: 3838 return -1 3939 else: 4040 if a['age'] > b['age']: 4141 return 1 4242 elif a['age'] < b['age']: 4343 return -1 4444 else: 4545 if a['name'] > b['name']: 4646 return 1 4747 else: 4848 return -1 4949 persons.sort(key=cmp_to_key(cmp)) 5050 new_persons = sorted(persons,key=cmp_to_key(cmp)) 5151 print(persons) 5252 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_keyfunc

将旧式比较函数(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 自定义比较函数比较函数类似于制定了比较规则。
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang