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 相关文章推荐
python中使用smtplib和email模块发送邮件实例
Apr 22 Python
python采用getopt解析命令行输入参数实例
Sep 30 Python
Python3使用requests登录人人影视网站的方法
May 11 Python
pandas系列之DataFrame 行列数据筛选实例
Apr 12 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
Django如何开发简单的查询接口详解
May 17 Python
浅析Python 引号、注释、字符串
Jul 25 Python
对python中return与yield的区别详解
Mar 12 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
python在协程中增加任务实例操作
Feb 28 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
May 25 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
prototype 1.5相关知识及他人笔记
2006/12/16 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
jquery实现点击弹出可放大居中及关闭的对话框(附demo源码下载)
2016/05/10 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
浅谈js的ajax的异步和同步请求的问题
2016/10/07 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
js实现密码强度检验
2017/01/15 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
JavaScript实现alert弹框效果
2020/11/19 Javascript
Bootstrap FileInput实现图片上传功能
2021/01/28 Javascript
python搭建简易服务器分析与实现
2012/12/15 Python
python使用正则表达式提取网页URL的方法
2015/05/26 Python
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
解决sublime+python3无法输出中文的问题
2018/12/12 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python3实现用turtle模块画一棵随机樱花树
2019/11/21 Python
python求绝对值的三种方法小结
2019/12/04 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
教师实习自我鉴定
2013/12/14 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
上甘岭观后感
2015/06/10 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
四群教育工作总结
2015/08/10 职场文书
外科护士长工作总结
2015/08/12 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python