如何用Python的max函数找第二大数?代码中min(arr)-1作用存疑
解释代码里
min(arr)-1的作用 先拆解你这段代码的逻辑:你已经通过arr1 = max(arr)拿到了数组的最大值,接下来要找第二大的数,所以用了带key参数的max函数来实现。
这个lambda表达式的规则是:
- 当当前元素
x等于最大值arr1时,给它的排序键设为min(arr)-1 - 当
x不是最大值时,排序键就是元素本身x
min(arr)-1的核心作用就是:把所有等于最大值的元素的键值,设置成比数组里最小元素还小的数值。这样在调用max函数时,这些最大值元素的键值会是整个数组里最小的,自然不会被max选中,剩下的元素中键值最大的那个,就是原数组的第二大数。
举个实际例子:假设输入数组是[5, 3, 5, 2],min(arr)是2,min(arr)-1就是1。此时每个元素对应的key值为:
- 第一个5 → 1
- 3 → 3
- 第二个5 → 1
- 2 → 2
这时max(arr, key=...)会选择key值最大的3,也就是原数组的第二大数,完全符合预期。
不过这种写法存在一个小问题:如果数组里所有元素都相同(比如[4,4,4]),min(arr)-1会把所有元素的key都设成更小的数,最后max返回的还是4,但这时候其实不存在真正的第二大数,这属于业务逻辑层面的特殊情况需要额外处理。
另外,还有更直观的写法可以实现找第二大数的需求,比如先过滤掉所有最大值再取剩余元素的最大值:
n = int(input()) arr = list(map(int, input().split())) max_val = max(arr) # 过滤掉所有等于最大值的元素 filtered_arr = [num for num in arr if num != max_val] # 处理所有元素都是最大值的情况 second_max = max(filtered_arr) if filtered_arr else max_val print(second_max)
内容的提问来源于stack exchange,提问作者Sanjana Hongunti
相关产品推荐
相关产品推荐

