在Python的七十多个内置函数中,max()和min()是比较常用的两个,用来查找一组数据中的最大值和最小值。这两个函数看似简单,实则暗藏了很多意想不到的功能,尤其是key参数,更为这两个函数增加了类似map()函数的功能。如果应用在代码中,必定产生鬼斧神工、匪夷所思的感觉,令人叹为观止!
1. 典型应用场景
这是max()和min()函数最常见的应用场景:从多个数值型参数中返回最大/最小值,或者返回数值型列表中的最大/最小值。这里说的数值型,是指整型和浮点型。
>>> max(1,3,5,7) # 返回多个数值型参数中的最大值
7
>>> min([2,4,6,8]) # 返回数值型列表中的最小值
2
2. 比较字符串
输入参数或列表元素的类型,除了数值型,还可以是字符串,但不能数值型和字符串型的混合。两个字符串比较大小的规则是从首字符开始比较其字符的ASCII码值,若相等,则比较后一位字符,直至分出大小。
>>> max(['a','b','c']) # 返回列表中最大的字符串
'c'
>>> min('2020-06-23 12:00:00', '2020-06-23 11:50:00') # 返回最早的日期时间字符串
'2020-06-23 11:50:00'
>>> max('1', '9', '10', '100') # 返回多个字符串中最大的字符串
'9'
>>> min('1', '9', '10', '100') # 返回多个字符串中最小的字符串
'1'
3. 比较列表或元组
除了数值型、字符串型,max()和min()函数还可以用于比较列表或元组的大小:顺序比较各元素,直至分出大小。当然,用来比较的元素必须是同一种类型,要么都是数值型,要么都是字符串型。
>>> max([8,4],[6,8]) # 返回多个列表中最大的列表
[8, 4]
>>> max([8,4],[8,4,2]) # 返回多个列表中最大的列表
[8, 4, 2]
>>> min(['8',4],['8',4,'2']) # 返回多个列表中最小的列表
['8', 4]
>>> min(('8',4, '3'),('8',4,'2')) # 返回多个元组中最小的元组
('8', 4, '2')
4. 找出字典、字符串、迭代器中的最大最小值
max()和min()函数不仅能比较列表或元组的元素的大小,也能从集合、字典、字符串、range对象、迭代器等对象中找出最大和最小的元素。
>>> max({3,4,5,6}) # 返回集合中的最大值
6
>>> min({'x':5, 'y':7, 'z':3}) # 返回字典元素中的最小值,结果是最小的键
'x'
>>> max("I'm xufive.") # 返回字符串中的最大字符(有点意外吧?)
'x'
>>> min("I'm xufive.") # 返回字符串中的最小字符
' '
>>> max(range(5)) # range()函数返回一个range对象
4
>>> max(map(abs, [-1,2,-3])) # map()函数返回一个迭代器
3
5. 使用key参数
我们注意到,使用max()和min()函数返回字典的最大/最小值,实际得到的是字典的键的最大/最小值。那么如何得到字典的值的最大/最小值呢?很简单,使用max()和min()函数的key参数。不过,需要提醒的是,使用key参数,返回的是字典中最大/最小值的键,而不是最大/最小值。
>>> d = {'x':5, 'y':7, 'z':3}
>>>> min(d) # 返回字典中最小的键
'x'
>>> min(d, key=lambda x:d[x]) # 返回字典中最小值的键,而非最小值
'z'
>>> max(d) # 返回字典中最大的键
'z'
>>> max(d, key=lambda x:d[x]) # 返回字典中最大值的键,而非最大值
'y'
6. 综合练习
最后,我们来做两道练习题,看看max()和min()函数的威力有多大。这两个问题并不难,初学者也能轻松给出答案,但是,要想写得优雅漂亮,非max()和min()函数不可。列表 [1,3,5,7,9,11,13,15,17]中,哪一个元素的正弦值最小?
列表 [8,5,2,4,3,6,5,5,1,4,5] 中,哪一个元素出现的频率最高?
问题1的参考答案:
>>> import math
>>> a = [1,3,5,7,9,11,13,15,17]
>>> min(a, key=math.sin)
11
>>> math.sin(11) # 元素11的正弦值最小
-0.9999902065507035
问题2的参考答案:
>>> a = [8,5,2,4,3,6,5,5,1,4,5]
>>> max(set(a), key=a.count)
5
>>> a.count(5) # 元素5出现了4次,次数最多
4