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 相关文章推荐
pygame学习笔记(6):完成一个简单的游戏
Apr 15 Python
Python自定义函数定义,参数,调用代码解析
Dec 27 Python
Python给你的头像加上圣诞帽
Jan 04 Python
pandas 把数据写入txt文件每行固定写入一定数量的值方法
Dec 28 Python
python判断文件是否存在,不存在就创建一个的实例
Feb 18 Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 Python
Linux下远程连接Jupyter+pyspark部署教程
Jun 21 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
Python爬虫实现模拟点击动态页面
Mar 05 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
python如何使用腾讯云发送短信
Sep 17 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
espresso double下 咖啡粉超细时 饼压力对咖啡的影响
2021/03/03 冲泡冲煮
mysql时区问题
2008/03/26 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
php实现基于PDO的预处理示例
2017/03/28 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
laravel使用数据库测试注意事项
2020/04/10 PHP
JavaScript高级程序设计 阅读笔记(十七) js事件
2012/08/14 Javascript
JavaScript数值千分位格式化的两种简单实现方法
2016/08/01 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
vuex 使用文档小结篇
2018/01/11 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
为什么使用koa2搭建微信第三方公众平台的原因
2018/05/16 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
React路由鉴权的实现方法
2019/09/05 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
[54:33]2018DOTA2亚洲邀请赛小组赛 A组加赛 Liquid vs Optic
2018/04/03 DOTA
python实现的简单窗口倒计时界面实例
2015/05/05 Python
在Python中定义和使用抽象类的方法
2016/06/30 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
2017/06/27 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
python实现BP神经网络回归预测模型
2019/08/09 Python
Python随机函数库random的使用方法详解
2019/08/21 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
tensorflow之tf.record实现存浮点数数组
2020/02/17 Python
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
Delphi CS笔试题
2014/01/04 面试题
旷课检讨书大全
2014/01/21 职场文书
中国梦读书活动总结
2014/07/10 职场文书
2016春节家属慰问信
2015/03/25 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
Vue操作Storage本地化存储
2022/04/29 Vue.js