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实现简单HTML表格解析的方法
Jun 15 Python
Python统计文件中去重后uuid个数的方法
Jul 30 Python
Python端口扫描简单程序
Nov 10 Python
Django使用httpresponse返回用户头像实例代码
Jan 26 Python
Tensorflow之Saver的用法详解
Apr 23 Python
Python日志模块logging基本用法分析
Aug 23 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
Dec 20 Python
python实现简易学生信息管理系统
Apr 05 Python
python 爬取古诗文存入mysql数据库的方法
Jan 08 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 Python
Python带参数的装饰器运行原理解析
Jun 09 Python
python实现简单的tcp 文件下载
Sep 16 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制作静态网站的模板框架(四)
2006/10/09 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
WordPress中用于获取文章作者与分类信息的方法整理
2015/12/17 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
PHP扩展mcrypt实现的AES加密功能示例
2019/01/29 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
JavaScript的Cookies
2008/01/16 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
jquery map方法使用示例
2014/04/23 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
python使用电子邮件模块smtplib的方法
2016/08/28 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
python爬取个性签名的方法
2018/06/17 Python
django orm模块中的 is_delete用法
2020/05/20 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
心理健康日活动总结
2014/05/08 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
2015年国际护士节演讲稿
2015/03/18 职场文书
趣味运动会标语口号
2015/12/26 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
浅谈Python 中的复数问题
2021/05/19 Python
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python