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实现的检测网站挂马程序
Nov 30 Python
深入讲解Python中面向对象编程的相关知识
May 25 Python
使用Python3编写抓取网页和只抓网页图片的脚本
Aug 20 Python
简单谈谈Python中的反转字符串问题
Oct 24 Python
Python3编程实现获取阿里云ECS实例及监控的方法
Aug 18 Python
python下解压缩zip文件并删除文件的实例
Apr 24 Python
Python多进程与服务器并发原理及用法实例分析
Aug 21 Python
python如何生成各种随机分布图
Aug 27 Python
Python高级特性与几种函数的讲解
Mar 08 Python
Python中的类与类型示例详解
Jul 10 Python
Python常用库大全及简要说明
Jan 17 Python
python 判断一组数据是否符合正态分布
Sep 23 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 smarty 二级分类代码和模版循环例子
2011/06/01 PHP
php定界符
2014/06/19 PHP
PHP中的use关键字概述
2014/07/23 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
PHP数组函数知识汇总
2016/05/12 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
jquery实现居中弹出层代码
2010/08/25 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
bootstrap中模态框、模态框的属性实例详解
2017/02/17 Javascript
详解node中创建服务进程
2017/05/09 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
Vue动态面包屑功能的实现方法
2019/07/01 Javascript
微信小程序仿通讯录功能
2020/04/09 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
js实现自定义右键菜单
2020/05/18 Javascript
[02:49]DOTA2完美大师赛首日观众采访
2017/11/23 DOTA
详解Python中的多线程编程
2015/04/09 Python
python数据结构之图的实现方法
2015/07/08 Python
python高斯分布概率密度函数的使用详解
2019/07/10 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
Python检测端口IP字符串是否合法
2020/06/05 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
体育教育个人自荐信范文
2013/12/01 职场文书
行政助理岗位职责范文
2013/12/03 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
教师产假请假条范文
2014/04/10 职场文书
保护环境建议书400字
2014/05/13 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL