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中的全局变量用法分析
Jun 09 Python
Python实现k-means算法
Feb 23 Python
Python框架Flask的基本数据库操作方法分析
Jul 13 Python
python中partial()基础用法说明
Dec 30 Python
Python3实现的反转单链表算法示例
Mar 08 Python
Python 3.6打包成EXE可执行程序的实现
Oct 18 Python
使用pyinstaller逆向.pyc文件
Dec 20 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
Python 如何创建一个简单的REST接口
Jul 30 Python
基于Python的身份证验证识别和数据处理详解
Nov 14 Python
Python实现我的世界小游戏源代码
Mar 02 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
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
rrmdir php中递归删除目录及目录下的文件
2011/05/15 PHP
php程序的国际化实现方法(利用gettext)
2011/08/14 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
微信支付开发维权通知实例
2016/07/12 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
eclipse导入jquery包后报错的解决方法
2014/02/17 Javascript
详解参数传递四种形式
2015/07/21 Javascript
jQuery 获取遍历获取table中每一个tr中的第一个td的方法
2016/10/05 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
[42:32]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第二场 10.28
2020/10/28 DOTA
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
基于Python闭包及其作用域详解
2017/08/28 Python
Python学生信息管理系统修改版
2018/03/13 Python
python 删除非空文件夹的实例
2018/04/26 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
Python爬虫PyQuery库基本用法入门教程
2018/08/04 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
Python 画出来六维图
2019/07/26 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
金融学专业大学生职业生涯规划
2014/03/07 职场文书
售后客服个人自我评价
2014/09/14 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
任命书怎么写
2015/03/02 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
实施意见格式范本
2015/06/05 职场文书