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 28 Python
分享一个可以生成各种进制格式IP的小工具实例代码
Jul 28 Python
python+opencv识别图片中的圆形
Mar 25 Python
python中itertools模块zip_longest函数详解
Jun 12 Python
解决python3捕获cx_oracle抛出的异常错误问题
Oct 18 Python
对Python强大的可变参数传递机制详解
Jun 13 Python
python五子棋游戏的设计与实现
Jun 18 Python
django框架面向对象ORM模型继承用法实例分析
Jul 29 Python
python 实现查询Neo4j多节点的多层关系
Dec 23 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
python和php哪个更适合写爬虫
Jun 22 Python
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
Jun 11 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缓存函数的使用说明
2013/05/10 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
PHP实现的简单AES加密解密算法实例
2017/05/29 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
页面只有一个text的时候,回车自动submit的解决方法
2010/08/12 Javascript
JQuery性能优化的几点建议
2014/05/14 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
微信小程序 下拉菜单的实现
2017/04/06 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
详解使用mocha对webpack打包的项目进行"冒烟测试"的大致流程
2020/04/27 Javascript
Webpack的Loader和Plugin的区别
2020/11/09 Javascript
[03:49]DOTA2 2015国际邀请赛中国区预选赛第二日现场百态
2015/05/27 DOTA
python协程用法实例分析
2015/06/04 Python
常用python编程模板汇总
2016/02/12 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
python skimage 连通性区域检测方法
2018/06/21 Python
python 为什么说eval要慎用
2019/03/26 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
python通用读取vcf文件的类(复制粘贴即可用)
2020/02/29 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
python用分数表示矩阵的方法实例
2021/01/11 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
国家励志奖学金获奖感言
2014/01/09 职场文书
干部鉴定材料
2014/05/18 职场文书
网络销售员岗位职责
2015/04/11 职场文书
关于社会实践的心得体会(2016最新版)
2016/01/25 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书