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中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
在Mac OS上搭建Python的开发环境
Dec 24 Python
python基础教程之分支、循环简单用法
Jun 16 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
python实现各进制转换的总结大全
Jun 18 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
Python连接Mssql基础教程之Python库pymssql
Sep 16 Python
Win10+GPU版Pytorch1.1安装的安装步骤
Sep 27 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
Pytorch中.new()的作用详解
Feb 18 Python
Python使用进程Process模块管理资源
Mar 05 Python
详解Python中的for循环
Apr 30 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 checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
2016/03/16 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
fancybox modal的完美解决(右上的X)
2012/10/30 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
JavaScript新窗口与子窗口传值详解
2014/02/11 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
跟混乱的页面弹窗说再见
2019/04/11 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
vue 实现特定条件下绑定事件
2019/11/09 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
Python导出数据到Excel可读取的CSV文件的方法
2015/05/12 Python
tensorflow 获取所有variable或tensor的name示例
2020/01/04 Python
python默认参数调用方法解析
2020/02/09 Python
python中get和post有什么区别
2020/06/19 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
canvas烟花特效锦集
2018/01/17 HTML / CSS
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
英文版餐饮运营管理求职信
2013/11/06 职场文书
大学生简历的个人自我评价
2013/12/04 职场文书
个人自荐书
2013/12/20 职场文书
2014年十一国庆节爱国演讲稿
2014/09/23 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
2014年小学教学工作总结
2014/11/13 职场文书