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 相关文章推荐
python3批量删除豆瓣分组下的好友的实现代码
Jun 07 Python
python图片验证码生成代码
Jul 02 Python
python模块简介之有序字典(OrderedDict)
Dec 01 Python
python实现批量按比例缩放图片效果
Mar 30 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
Jan 23 Python
详解Django+uwsgi+Nginx上线最佳实战
Mar 14 Python
python字典的setdefault的巧妙用法
Aug 07 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
浅谈python 中的 type(), dtype(), astype()的区别
Apr 09 Python
Django实现微信小程序支付的示例代码
Sep 03 Python
解决pytorch 的state_dict()拷贝问题
Mar 03 Python
Python中seaborn库之countplot的数据可视化使用
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
虫族 Zerg 魔法科技
2020/03/14 星际争霸
PHP中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
PHP数据类型之布尔型的介绍
2013/04/28 PHP
php操作xml
2013/10/27 PHP
php统计文章排行示例
2014/03/04 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
Centos PHP 扩展Xchche的安装教程
2016/07/09 PHP
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
点击表单提交时出现jQuery没有权限的解决方法
2014/07/23 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
纯javascript实现图片延时加载方法
2015/08/21 Javascript
jQuery+html5+css3实现圆角无刷新表单带输入验证功能代码
2015/08/21 Javascript
轮播的简单实现方法
2016/07/28 Javascript
理解javascript中的闭包
2017/01/11 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
Node 搭建一个静态资源服务器的实现
2019/05/20 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
vue 子组件和父组件传值的示例
2020/09/11 Javascript
python使用内存zipfile对象在内存中打包文件示例
2014/04/30 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
快速实现基于Python的微信聊天机器人示例代码
2017/03/03 Python
python如何实现反向迭代
2018/03/20 Python
python实现自动发送报警监控邮件
2018/06/21 Python
Python3标准库总结
2019/02/19 Python
【python】matplotlib动态显示详解
2019/04/11 Python
对DJango视图(views)和模版(templates)的使用详解
2019/07/17 Python
详解python tkinter模块安装过程
2020/01/06 Python
Spy++的使用方法及下载教程
2021/01/29 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
办公室主任先进事迹
2014/01/18 职场文书
《长城》教学反思
2014/02/14 职场文书
团支部推优材料
2014/05/21 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
我去timi了,一起去timi是什么意思?
2022/04/13 杂记