在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初学者,如有大牛批评指正,深感荣幸。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 老头杯第二届规则是什么 英雄联盟老头杯第二届规则介绍
- 王崴-爵士听堂.蓝色波萨(HQCD)[WAV+CUE]
- 群星《欧美动听情歌·柔情第5季》2CD【DTS-WAV分轨】
- [极品珍藏]德意志进行曲集卡拉扬SACD[WAV+CUE]
- 前暴雪制作人呼吁反击DEI 玩家:夺回文化!
- 腾讯证实子公司Sharkmob大规模裁员:整个市场很低迷
- 荣耀加冕 问鼎冠军 中国代表队获第四届东亚电竞锦标赛团体总冠军
- 污甩乐队.2024-Let.the.dirt.left【摩登天空】【FLAC分轨】
- 杜德伟.1994-ALL.FOR.YOU(英)【滚石】【WAV+CUE】
- 群星.2013-百代好声音ADMSCD1【EMI百代】【WAV+CUE】
- 群星《私人音乐精选示范碟》PRIVATEMUSIC 发烧唱片名碟[WAV+CUE][1.1G]
- 山口百惠《あなたへの子守唄》日本索尼钢刻字首版[WAV分轨][1.1G]
- 群星《宝丽金20周年特别发烧版》1:1母盘直刻限量编号[低速原抓WAV+CUE][1G]
- 凤飞飞.1984-仲夏(夏艳)[WAV]
- 常安《民歌红·江南燕》DTS-ES6.1[WAV]