举例如下:

 from functools import cmp_to_key
persons = [
{
'name':'zhangsan',
'age':20,
'grade':98
},
{
'name':'lisi',
'age':18,
'grade': 88
},
{
'name':'wangwu',
'age':20,
'grade': 20
},
{
'name': 'yanqing',
'age': 15,
'grade': 20
},
{
'name': 'awu',
'age': 20,
'grade': 20
},
] def cmp(a,b):
# 如果返回的是一个大于0的值,那么代表a>b
# 如果返回的是一个小于0的值,那么代表a<b
# 如果返回的是一个等于0的值,那么代表a=b
if a['grade'] > b['grade']:
return 1 elif a['grade'] < b['grade']:
return -1
else:
if a['age'] > b['age']:
return 1
elif a['age'] < b['age']:
return -1
else:
if a['name'] > b['name']:
return 1
else:
return -1
persons.sort(key=cmp_to_key(cmp))
new_persons = sorted(persons,key=cmp_to_key(cmp))
print(persons)
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 自定义比较函数 比较函数类似于制定了比较规则。

Python_sort函数结合functools.cmp_to_key(func)分析的更多相关文章

  1. Python标准库: functools (cmp_to_key, lru_cache, total_ordering, partial, partialmethod, reduce, singledispatch, update_wrapper, wraps)

    functools模块处理的对象都是其他的函数,任何可调用对象都可以被视为用于此模块的函数. 1. functools.cmp_to_key(func) 因为Python3不支持比较函数,cmp_to ...

  2. 31.C++-虚函数之构造函数与析构函数分析

    1.构造函数不能为虚函数 当我们将构造函数定义为虚函数时,会直接报错: 首先回忆下以前学的virtual虚函数概念: 如果类定义了虚函数,创建对象时,则会分配内存空间,并且为该父类以及其所有子类的内存 ...

  3. PHP 基础系列(三) 【转】PHP 函数实现原理及性能分析

    作者:HDK (百度) 前言 在任何语言中,函数都是最基本的组成单元.对于PHP的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性 ...

  4. 对线程等待函数pthread_join二级指针参数分析

    分析之前先搞明白,这个二级指针其实在函数内部是承接了上个线程的返回值. 看man手册,发现返回值是个普通指针.人家用二级指针来承接,可能准备干大事.这个可以自己搜索一下.原因嘛,二级指针是保存了这个地 ...

  5. php使用file函数、fseek函数读取大文件效率分析

    php读取大文件可以使用file函数和fseek函数,但是二者之间效率可能存在差异,本文章向大家介绍php file函数与fseek函数实现大文件读取效率对比分析,需要的朋友可以参考一下. 1. 直接 ...

  6. 函数 y=x^x的分析

    关于函数 y=xx的分析: 由图像得,y在负无穷大到0图像处处不连续,故y的定义域为(0,正无穷大): 故该函数不就是y=e^(lnxx)吗? 1.定义域:我们变形一下,y=e^(xlnx),显然是0 ...

  7. Linux fork函数具体图解-同一时候分析一道腾讯笔试题

    原创blog.转载请注明出处 头文件: #include<unistd.h> #include<sys/types.h> 函数原型: pid_t fork( void); (p ...

  8. CVE-2010-2553:Microsoft Cinepak Codec CVDecompress 函数堆溢出漏洞调试分析

    0x01 前言 微软提供一个叫 Cinepak 的视频解码器,通过调用 iccvid.dll 这个动态链接库文件可以使用这个解码器:微软自带的 Windows Media Player(视频音频软件) ...

  9. dll导入导出宏定义,出现“不允许 dllimport 函数 的定义”的问题分析

    建立dll项目后,在头文件中,定义API宏 #ifndef API_S_H #define API_S_H ...... #ifndef DLL_S_20160424 #define API _dec ...

随机推荐

  1. [题解](约数)BZOJ_1053_反素数

    三条引理:1.1~N中最大风反质数,就是1~N中约数个数最多的最小的一个 比较显然,是应该看出来的一条 2.1~N中任何数的不同因子都不会超过10个,且所有质因子的指数之和不超过30: 2*3*5*7 ...

  2. Django REST framework 的快速入门教程

    CRM-API项目搭建 序列器(Serializers) 首先,我们来定义一些序列器.我们来创建一个新的模块(module)叫做 crm/rest_searializer.py ,这是我们用来描述数据 ...

  3. Qt 2D绘图之三:绘制文字、路径、图像、复合模式

    一.绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::font ...

  4. 安装linux时的分区问题,需要了解目录树及挂载知识

    Linux是目录树架构,如何结合目录树架构与磁盘内的数据→挂载. Linux先有目录,后有磁盘分区.数据(文件)依存于目录. 目录为挂载点,磁盘分区的数据放置在该目录下,进入该目录,就可以读取该分区. ...

  5. mysql合服 更新相同的用户名前追加服务器编号

    表结构: CREATE TABLE IF NOT EXISTS `user` ( `) NOT NULL COMMENT '主键', `user_level` ) COMMENT '等级', `) C ...

  6. [转]为ReportViewer导出的PDF文档加上水印

    接到一個頗富挑戰性的需求,Reporting Service或RDLC報表可匯出成Excel.PDF等檔案格式,對一般麻瓜型使用者而言,PDF唯讀,Excel則可修改,業務單位希望在拿到報表紙本時加以 ...

  7. Redis的下载安装

    Redis官网只提供了Linux版,MicroSoft自己搞了个Windows版,可在GitHub下载: https://github.com/microsoftarchive/redis/relea ...

  8. 初识requestAnimationFrame

    转载地址:https://blog.csdn.net/vhwfr2u02q/article/details/79492303 核心概念: 1.CPU节能:在页面不刷新时不执行回调(页面在隐藏.最小化等 ...

  9. POJ 3107 Godfather (树的重心)

    题意:求树的重心,若有多个,全部打印出来. 思路: 树的重心:在删除点v后,森林中的每棵树的节点数尽量均匀,若最大的那棵树的节点数最小,称v为树的重心. 这道题只是求树的所有重心,当且经当这棵树有对称 ...

  10. 添加 SSH 公钥

    生成 SSH 密钥 ssh-keygen -t rsa -C "YOUR_EMAIL@YOUREMAIL.COM" 获取 SSH 公钥信息 cat ~/.ssh/id_rsa.pu ...