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机器学习之决策树分类详解
Dec 20 Python
python简单商城购物车实例代码
Mar 15 Python
Python封装原理与实现方法详解
Aug 28 Python
Python socket实现多对多全双工通信的方法
Feb 13 Python
对python3.4 字符串转16进制的实例详解
Jun 12 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
Python selenium环境搭建实现过程解析
Sep 08 Python
Python函数中的不定长参数相关知识总结
Jun 24 Python
python函数的两种嵌套方法使用
Apr 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
关于尾递归的使用详解
2013/05/02 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
PHP中把对象转换为关联数组代码分享
2015/04/09 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
学习ExtJS Column布局
2009/10/08 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
Jquery响应回车键直接提交表单操作代码
2014/07/25 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
JavaScript获取URL参数的方法之一
2017/03/24 Javascript
微信小程序实现添加手机联系人功能示例
2017/11/30 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
vue中axios实现数据交互与跨域问题
2019/05/12 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
vant 自定义 van-dropdown-item的用法
2020/08/05 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
Python自动生产表情包
2017/03/17 Python
Python生成随机数组的方法小结
2017/04/15 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
python如何爬取网页中的文字
2020/07/28 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
CHARLES & KEITH加拿大官网:新加坡时尚品牌
2020/03/26 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
倡议书范文大全
2015/04/28 职场文书
员工年度工作总结2015
2015/05/18 职场文书
自信主题班会
2015/08/14 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python