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发送SMTP邮件的教程
Apr 29 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
Python环境下搭建属于自己的pip源的教程
May 05 Python
Python实现加载及解析properties配置文件的方法
Mar 29 Python
python生成ppt的方法
Jun 07 Python
python实现彩色图转换成灰度图
Jan 15 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
Python利用matplotlib做图中图及次坐标轴的实例
Jul 08 Python
python pandas利用fillna方法实现部分自动填充功能
Mar 16 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
django rest framework 自定义返回方式
Jul 12 Python
Python快速实现一键抠图功能的全过程
Jun 29 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 DOS攻击实现代码(附如何防范)
2012/05/29 PHP
php专用数组排序类ArraySortUtil用法实例
2015/04/03 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
[企业公众号]升级到[企业微信]之后发送消息失败的解决方法
2017/06/30 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
JS中的数组的sort方法使用示例
2014/01/22 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
用原生js统计文本行数的简单示例
2016/08/19 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
JS实现的简单拖拽购物车功能示例【附源码下载】
2018/01/03 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
JS的时间格式化和时间戳转换函数示例详解
2020/07/27 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
Python实现的弹球小游戏示例
2017/08/01 Python
python机器学习实战之树回归详解
2017/12/20 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
2020/03/02 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
python中pickle模块浅析
2020/12/29 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
查找廉价航班和发现新目的地:Kiwi.com
2019/02/25 全球购物
印尼网上商店:Alfacart.com
2019/03/11 全球购物
波兰在线香水店:Perfumy.pl
2019/08/12 全球购物
违反工作纪律检讨书
2014/02/15 职场文书
幼儿园师德演讲稿
2014/05/06 职场文书
绿色环保标语
2014/06/12 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
典型事迹材料范文
2014/12/29 职场文书
2016年教师政治思想表现评语
2015/12/02 职场文书