视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python3.x中自定义比较函数
2020-11-27 14:33:00 责编:小采
文档


在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初学者,如有大牛批评指正,深感荣幸。

下载本文
显示全文
专题