Python 内建函数 max/min的高级用法

版权声明: https://blog.csdn.net/luoyayun361/article/details/82287677

max/min 函数

Python 中的 max/min函数是用来获取传入参数的最大值或最小值的,其运行机制都一样,所以这里主要描述 max 的运行机制以及使用方法。

最简单的用法,就是直接传入两个要对比的元素,可以返回其两个元素中的最大值。因为使用很简单,这里不做过多介绍。

那么重点说一下这两个内建函数的比较高级的用法, 就是直接传入序列,会返回序列中的最大/最小值。
函数原型:max(iterable, key, default)
这是求迭代器的最大值,其中iterable 为迭代器,max会for i in … 遍历一遍这个迭代器,然后将迭代器的每一个返回值当做参数传给key=func 中的func(一般用lambda表达式定义) ,然后将func的执行结果传给key,然后以key为标准进行大小的判断。
注意,这里的重点是key,key 可以由一个lambda函数来表示,并通过 key 的不同, 最终计算出来的值也会不同。
如果觉得以上描述还是比较难懂,那么可以这样理解:key是一个关键字,它告诉 max 应该通过什么因素去进行计算。

OK,话不多说,直接来看示例

示例

这里通过几个简单的示例代码来进行说明:

v1 = {'name':'xiaoming','age':18}
v2 = {'name':'zro','age':10}
v3 = {'name':'april','age':30}

b = [v1,v2,v3]
print(max(b,key = lambda x:x['name']))

print(max(b,key = lambda x:x['age']))

输出结果:

{'name': 'zro', 'age': 10}
{'name': 'april', 'age': 30}

解析:
第一句 print(max(b,key = lambda x:x[‘name’])),这里的 max 传入的 key 是一个lambda语句,这句话的意思就是 要将字典中的‘name’作为对比的元素,然后会遍历整个迭代器,并将 ‘name’元素取出来进行对比,所以最终输出结果为:

{'name': 'zro', 'age': 10}

因为三种字典中,’zro’才是最大的(通过对比字符串,从左至由对其 ASCII 码进行比较)。
而第二句print(max(b,key = lambda x:x[‘age’])),原理和上面一样,这是去字典中的‘age’来进行对比,所以最终输出的结果就很明了了。


如果说上面的示例还是难理解,那么再来看一个相对简单的示例:

a = [1,2,3,3,4,5,6,1,2,7,2,9,1,2]
print(max(a,key = lambda x:a.count(x)))

输出结果为:2
解析:这里 a 是一个列表,max 函数指定的 key 是使用a 列表的 count()函数,count()函数是用于统计列表中某个元素的个数,那么这里的 max 计算出来的结果就是通过整理 a 列表中所有元素里面出现的个数最多的元素,所以输出为2。
另外,上面的写法可以更简单一些:

print(max(a,key = a.count))

其输出结果是一样的。

经过上面的说明,应该理解起来就比较容易了。那么下面的语句就会很容易看懂了。

x=[23,14323,462,3323,761]
#将元素转换成字符串后进行对比
print(max(x,key = str))
#返回转换成字符串后最长的值
print(max(x,key = lambda item:len(str(item))))

def myFun(item):
    return str(item)
#使用自定义函数指定排序规则
print(max(x,key = myFun))

value = ((8,9,10),(8,10,9),(8,9,11))
print(max(value))
#只比较下标为0和2的两个元素
print(max(value,key = lambda item:(item[0],item[2])))

输出:

761
14323
761
(8, 10, 9)
(8, 9, 11)

参考文章:https://www.cnblogs.com/rendawei/p/7057010.html
https://blog.csdn.net/oh5W6HinUg43JvRhhB/article/details/78869541

猜你喜欢

转载自blog.csdn.net/luoyayun361/article/details/82287677