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编程判断一个正整数是否为素数的方法
Apr 14 Python
Python 含参构造函数实例详解
May 25 Python
Python探索之创建二叉树
Oct 25 Python
Python决策树和随机森林算法实例详解
Jan 30 Python
Python爬虫PyQuery库基本用法入门教程
Aug 04 Python
对python PLT中的image和skimage处理图片方法详解
Jan 10 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
Python数据类型之String字符串实例详解
May 08 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 Python
pymysql的简单封装代码实例
Jan 08 Python
pytorch梯度剪裁方式
Feb 04 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 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 设计模式之观察者模式介绍
2012/02/22 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
2020/02/27 PHP
utf8的编码算法 转载
2006/12/27 Javascript
ie 调试javascript的工具
2009/04/29 Javascript
JSQL 批量图片切换的实现代码
2010/05/05 Javascript
基于jquery的复制网页内容到WORD的实现代码
2011/02/16 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
js charAt的使用示例
2014/02/18 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
jQuery读取XML文件内容的方法
2015/03/09 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
jQuery模拟360浏览器切屏效果幻灯片(附demo源码下载)
2016/01/29 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
Vue实现简单计算器案例
2020/02/25 Javascript
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
python实现学生信息管理系统
2020/04/05 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
python实现无边框进度条的实例代码
2020/12/30 Python
基于Python实现天天酷跑功能
2021/01/06 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
塔吉特百货公司官网:Target
2017/04/27 全球购物
诺心蛋糕官网:LE CAKE
2018/08/25 全球购物
关于期中考试的反思
2014/02/02 职场文书
节能标语大全
2014/06/21 职场文书
评职称个人总结
2015/03/05 职场文书
Nginx 根据URL带的参数转发的实现
2021/04/01 Servers
http通过StreamingHttpResponse完成连续的数据传输长链接方式
2022/02/12 Python