Python3.x中自定义比较函数


Posted in Python onApril 24, 2015

在Python3.x的世界里,cmp函数没有了。那么sorted,min,max等需要比较函数作为参数的函数该如何用呢?

以min函数的定义为例,有两种重载形式:

单参数(一个迭代器):

min(iterable[, key=func]) -> value 

多参数(多个待比较内容):
min(a, b, c, ...[, key=func]) -> value 

本文主要讨论key=func参数的使用 。举例说明吧:

1.自定义对象的比较
我定义了一个类test,有两个成员变量a和b:

class test:  

         def __init__(self,a,b):  

              self.a = a  

              self.b = b 

然后实例化了三个对象x,y,z:
x=test(10,'x')  

y=test(2,'y')  

z=test(8,'z') 

我想让它们以变量a为标准做比较,求得a最小的对象:
minTest=min(x,y,z,key=lambda t:t.a) 

由于key这个参数需要传入一个函数,用lambda匿名函数很方便。本例中要实现比较函数(准确地说是比较关键字函数),故lamda的参数只要一个,随便你取什么名字(我用的是t),代表待比较的对象(即a,b,c);冒号后面是表达式,这里直接返回t的成员变量a。

于是乎,min函数(换成max,sorted等函数也是类似的)就会根据每个待比较对象的a值进行分别比较,返回a值最小的对象(的引用)赋值给minTest。

输出一下minTest.a,minTest.b就可以验证结果啦。

2.字典值value的比较
有一个字典:

dic={'b':3,'a':5,'c':9,'d':2} 

如果要根据字典的键key排序,只要:
sorted(dic)

返回一个list,是排序后的键,但是值没有放入list:
['a', 'b', 'c', 'd'] 

用以下方法就好了:
>>> sorted(dic.items())  

[('a', 5), ('b', 3), ('c', 9), ('d', 2)]

如果要根据值value排序呢?那么就传入比较函数这一参数就好啦:
sorted(dic.items(),key=lambda d:d[1])

我继续用lambda匿名函数。其中d表示dic.items()里的每个迭代元素,即一个元组(例如('a', 5));表达式d[1]就是元组中的第二个元素(例如5),它也是字典的值value,我们需要以它为比较标准。运行结果:
[('d', 2), ('b', 3), ('a', 5), ('c', 9)]

P.S.
博主今天闯关The Python Challenge遇到一关,需要统计文本中出现的字符个数并找出出现最少的字符。当然那一关其实不需要自己写比较函数,输出统计结果肉眼看得出。博主借助搜索引擎min函数的key=func参数时,深痛中文Python介绍文章都是旧世界Python2.x的天下,满是在新世界不能用的语法,给Python3.x的初学者带来很多误导,有害无益。故出此文。

博主也是Python初学者,如有大牛批评指正,深感荣幸。

Python 相关文章推荐
matplotlib作图添加表格实例代码
Jan 23 Python
ubuntu17.4下为python和python3装上pip的方法
Jun 12 Python
Python中垃圾回收和del语句详解
Nov 15 Python
浅谈python中str字符串和unicode对象字符串的拼接问题
Dec 04 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
python有序查找算法 二分法实例解析
Feb 18 Python
python实现在线翻译功能
Mar 03 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
Python连接Impala实现步骤解析
Aug 04 Python
python 下载文件的多种方法汇总
Nov 17 Python
python接口测试返回数据为字典取值方式
Feb 12 Python
使用Python脚本将绝对url替换为相对url的教程
Apr 24 #Python
Python3.x版本中新的字符串格式化方法
Apr 24 #Python
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 #Python
使用Python编写一个在Linux下实现截图分享的脚本的教程
Apr 24 #Python
修改Python的pyxmpp2中的主循环使其提高性能
Apr 24 #Python
Python的Tornado框架异步编程入门实例
Apr 24 #Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
Apr 24 #Python
You might like
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
PHP采用get获取url汉字出现乱码的解决方法
2014/11/13 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
jquery实现滑动图片自己测试的例子
2013/11/05 Javascript
jQuery中prepend()方法使用详解
2015/08/11 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
微信小程序教程之本地图片上传(leancloud)实例详解
2016/11/16 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
微信小程序倒计时功能实现代码
2017/11/09 Javascript
vue的常用组件操作方法应用分析
2018/04/13 Javascript
Vue 实现树形视图数据功能
2018/05/07 Javascript
js获取本日、本周、本月的时间代码
2020/02/01 Javascript
[48:21]林俊杰圣堂刺客超神杀戮秀
2014/10/29 DOTA
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
Python logging模块学习笔记
2014/05/24 Python
python通过floor函数舍弃小数位的方法
2015/03/17 Python
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
Django 导出 Excel 代码的实例详解
2017/08/11 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
python代码打印100-999之间的回文数示例
2019/11/24 Python
python使用HTMLTestRunner导出饼图分析报告的方法
2019/12/30 Python
关于ResNeXt网络的pytorch实现
2020/01/14 Python
Python项目打包成二进制的方法
2020/12/30 Python
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
FC-Moto美国:欧洲最大的摩托车服装和头盔商店之一
2019/08/24 全球购物
英文简历中的自我评价用语
2013/12/09 职场文书
法人代表委托书
2014/04/04 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书
2015年学校远程教育工作总结
2015/07/20 职场文书
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang
Python如何让字典保持有序排列
2022/04/29 Python
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang