CC++ & Algorithm

Python最大值与最小值 max/min

中等3
语言版本:C++Python
概述:学习用Python的一行代码找出多个数字或列表中的最大值和最小值。

轻松找出最大最小值:Python 的 maxmin 函数

生活中我们经常要比较大小。比如,全班同学的身高,谁最高?谁最矮?在一次考试中,最高分和最低分分别是多少?Python 里有两个非常好用的函数 —— max()min(),可以帮我们快速找出“最大”和“最小”。它们就像两个小助手,你只要把数字(或其他可比较的东西)交给它们,它们就能立刻告诉你答案。


认识 maxmin:一次比较多个数字

最简单的用法:把几个数字直接放进括号里,用逗号隔开。max() 会返回最大的那个,min() 返回最小的那个。

# 找出三个数字中最大的
print(max(10, 25, 18))   # 输出 25
# 找出三个数字中最小的
print(min(10, 25, 18))   # 输出 10

你可以一次放很多个数字,比如比较五个人的零花钱:

# 比较小明的零花钱 20元、小红的 35元、小刚的 15元、小丽的 40元、小华的 10元
pocket_money1 = 20   # 小明的零花钱
pocket_money2 = 35   # 小红的零花钱
pocket_money3 = 15   # 小刚的零花钱
pocket_money4 = 40   # 小丽的零花钱
pocket_money5 = 10   # 小华的零花钱
print("最多的零花钱:", max(pocket_money1, pocket_money2, pocket_money3, pocket_money4, pocket_money5))  # 40
print("最少的零花钱:", min(pocket_money1, pocket_money2, pocket_money3, pocket_money4, pocket_money5))  # 10

数字可以是整数、小数,甚至负数,maxmin 都能正确处理:

print(max(-3, 0, 2))    # 2
print(min(-1.5, 0.3, -2.7))  # -2.7

从列表、元组、集合中找最大最小

如果数字非常多,一个一个写会很麻烦。我们可以先把它们放进一个列表(或其他“容器”),然后把整个列表丢给 maxmin

原版例子(升级加注释):

scores = [85, 92, 78, 95, 88]  # 考试成绩列表
highest = max(scores)
lowest = min(scores)
print("最高分", highest)   # 输出 最高分 95
print("最低分", lowest)    # 输出 最低分 78

除了列表,也可以对元组集合使用:

# 元组:一次体育测试的跑步成绩(秒)
running_times = (12.5, 11.8, 13.2, 11.5, 12.0)  # 跑步时间元组
fastest = min(running_times)   # 时间越短越快
slowest = max(running_times)
print("最快用时", fastest, "秒")   # 11.5
print("最慢用时", slowest, "秒")   # 13.2

# 集合:班级里不同喜欢的零食种类编号
snack_ids = {101, 205, 303, 107, 205}  # 零食编号集合,注意集合会去重
print("最小编号:", min(snack_ids))   # 101
print("最大编号:", max(snack_ids))   # 303

字符串也能比大小

maxmin 不仅能比较数字,还能比较字符串。字符串的比较规则是:按字母顺序(更准确地说是按字符的 Unicode 编码值)。比如 "apple""banana" 比较,第一个字母 ab 小,所以 "banana" 更大。

# 比较两个水果名字
fruit1 = "apple"
fruit2 = "banana"
print("更大的水果名:", max(fruit1, fruit2))   # banana
print("更小的水果名:", min(fruit1, fruit2))   # apple

如果字符串有多个字母,Python 会一个一个字符比较,直到分出大小。比如 "cat""car",前两个字母都是 ca,第三个字母 tr 大,所以 "cat" 更大。

print(max("cat", "car"))   # cat

注意:大小写也会影响结果,因为大写字母的编码值比小写字母小(比如 'A' 是 65,'a' 是 97)。所以 "Apple""banana" 小。

print(max("Apple", "banana"))   # banana (因为 'A' 小于 'b')

进阶使用:用 key 自定义比较规则

有时候我们不想直接比较元素本身,而是想根据元素的某个属性来比较。比如,我们有多个同学的分数,但数据是字符串 "小明:85" 这种格式,想找出分数最高的同学。这时可以用 key 参数,指定一个“转换函数”,让 maxmin 先对每个元素应用这个函数,再比较结果。

# 学生成绩信息,格式是 "名字:分数"
students = ["小明:85", "小红:92", "小刚:78", "小丽:95", "小华:88"]

# 定义一个函数,提取分数(冒号后面的数字)
def get_score(student):
    # 用 split(':') 按冒号分割,取第二部分并转成整数
    return int(student.split(':')[1])

# 找出分数最高的学生
best_student = max(students, key=get_score)
print("最高分的学生:", best_student)   # 小丽:95

# 也可以直接写 lambda 表达式,更简洁
worst_student = min(students, key=lambda s: int(s.split(':')[1]))
print("最低分的学生:", worst_student)   # 小刚:78

key 参数还可以配合 abs(绝对值)来找出距离 0 最远的数字:

numbers = [-10, 5, -3, 8, -1]   # 一组数
farthest = max(numbers, key=abs)   # 按绝对值比较,-10 的绝对值最大
print("距离0最远的数:", farthest)   # -10

常见错误与注意事项

  1. 空列表或空序列会报错
    当你用 max([])min([]) 对一个空列表求值,Python 会抛出 ValueError,因为它找不到任何元素来比较。

    # 错误示例
    empty_list = []
    # print(max(empty_list))   # 运行会报错:ValueError: max() arg is an empty sequence
    

    解决方法:确保序列非空,或者使用 default 参数(Python 3.4+)提供一个默认值,当序列为空时返回它。

    safe_max = max(empty_list, default=0)   # 如果列表为空,返回 0
    print(safe_max)   # 0
    
  2. 混合不同类型可能出错
    maxmin 要求所有元素是“可比较”的。比如把数字和字符串混在一起:

    # print(max(5, "hello"))   # 报错:TypeError: '>' not supported between instances of 'str' and 'int'
    

    通常,我们需要保证传入的元素类型相同(都是数字或都是字符串)。

  3. 对字典使用 maxmin 时注意
    如果直接对字典使用 max(d),它比较的是字典的,而不是值。要想找出值最大的键,需要用 key 参数。

    fruit_prices = {"apple": 5, "banana": 3, "orange": 8}   # 水果价格字典
    # 直接 max 比较键
    print(max(fruit_prices))   # orange(按字母顺序最大的键)
    # 按价格比较,找出最贵的水果名
    most_expensive = max(fruit_prices, key=fruit_prices.get)
    print("最贵的水果:", most_expensive)   # orange(价格 8)
    

完整示例:班级成绩统计

下面是一个结合了列表、字符串比较和 key 参数的完整程序,帮助你巩固知识。假设我们有三位同学的成绩单,我们要找出:最高分、最低分,以及成绩最好的同学名字。

# 三位同学的成绩数据:名字和分数
student1_name = "张明"
student1_score = 88

student2_name = "李丽"
student2_score = 95

student3_name = "王强"
student3_score = 72

# 将分数放进列表
score_list = [student1_score, student2_score, student3_score]   # 分数列表

highest_score = max(score_list)   # 最高分
lowest_score = min(score_list)    # 最低分
print("全班最高分:", highest_score)   # 95
print("全班最低分:", lowest_score)   # 72

# 用字典存储名字和分数,找出分数最高的同学
student_dict = {
    student1_name: student1_score,
    student2_name: student2_score,
    student3_name: student3_score
}
best_student = max(student_dict, key=student_dict.get)   # 按分数找名字
worst_student = min(student_dict, key=student_dict.get)
print("成绩最好的同学:", best_student)   # 李丽
print("成绩最差的同学:", worst_student)   # 王强

运行这段代码,你会看到清晰的输出结果,就像老师在统计成绩一样简单。


延伸学习

maxmin 是 Python 内置函数中最常用的一对。学会了它们,你还可以学习:

  • sum():计算总和,比如全班总成绩。
  • sorted():对列表排序,从大到小或从小到大,配合 reverse 参数。
  • len():获取列表长度,结合 max 可以找出最长的字符串。
  • abs():求绝对值,配合 key 可以实现一些特殊比较。

下次遇到“谁最高”“谁最矮”“哪个最大”“哪个最小”的问题,别忘了这两个好朋友——maxmin

例题精讲

1单选题

在Python中,执行 `max(3, 7, 1, 9, 4)` 的结果是什么?

A3
B7
C9
D4
2判断题

在Python中,执行 `min([8, 2, 5, 10, 3])` 的结果是2。

3填空题
以下代码用于找出列表 `scores` 中的最高分并打印,请填写空白处。
scores = [88, 92, 75, 96, 83]
max_score = ___(scores)
print(max_score)
4单选题

对于字符串列表 `['apple', 'Banana', 'cherry', 'Date']`,执行 `min(['apple', 'Banana', 'cherry', 'Date'])` 的结果是什么?(提示:字符串比较按字典序,大写字母小于小写字母)

A'apple'
B'Banana'
C'cherry'
D'Date'
5填空题
以下代码需要找出四个数中的最小值并打印,请补充完整。
a = 15
b = 8
c = 22
d = 12
min_value = ___(a, b, c, d)
print(min_value)