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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
用Python实现QQ游戏大家来找茬辅助工具
Sep 14 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
Aug 23 Python
Selenium 模拟浏览器动态加载页面的实现方法
May 16 Python
python中的二维列表实例详解
Jun 19 Python
python中pika模块问题的深入探究
Oct 13 Python
python 判断文件还是文件夹的简单实例
Jun 10 Python
选择python进行数据分析的理由和优势
Jun 25 Python
python文字转语音的实例代码分析
Nov 12 Python
PyTorch学习:动态图和静态图的例子
Jan 06 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 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 工厂模式使用方法
2010/05/18 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
jQuery对象和DOM对象相互转化
2009/04/24 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
简洁短小的 JavaScript IE 浏览器判定代码
2010/03/21 Javascript
javascript 词法作用域和闭包分析说明
2010/08/12 Javascript
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
JS获取IP、MAC和主机名的五种方法
2013/11/14 Javascript
jquery得到iframe src属性值的方法
2014/09/25 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
利用javascript实现的三种图片放大镜效果实例(附源码)
2017/01/23 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
JavaScript实现简单贪吃蛇效果
2020/03/09 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
vue路由分文件拆分管理详解
2020/08/13 Javascript
在antd4.0中Form使用initialValue操作
2020/11/02 Javascript
python3.0 字典key排序
2008/12/24 Python
python多线程扫描端口示例
2014/01/16 Python
详解Python中的__init__和__new__
2014/03/12 Python
python基于xmlrpc实现二进制文件传输的方法
2015/06/02 Python
python 线程的暂停, 恢复, 退出详解及实例
2016/12/06 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
pytorch中的transforms模块实例详解
2019/12/31 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
Jupyter 无法下载文件夹如何实现曲线救国
2020/04/22 Python
Python不支持 i ++ 语法的原因解析
2020/07/22 Python
Python word文本自动化操作实现方法解析
2020/11/05 Python
迪卡侬印度官网:购买所有体育用品
2017/06/24 全球购物
Delphi笔试题
2016/11/14 面试题
2014年百日安全生产活动总结
2014/05/04 职场文书
承诺书范文
2014/06/03 职场文书
检讨书格式
2019/04/25 职场文书