You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python数组获取最大与第二大值的代码是否存在错误?求排查

Python数组求最大值和第二大值的代码错误分析与修复

我编写了一段Python代码,用于从数组中打印最大值和第二大值,代码如下:

from array import *

array1 = array('i', [10,5,99,88,99,99,10,12,9,9,13,45,45,18,21,13,13,22,99])
#array2 = array('i', [10,5,99,88,99,99,10,12,9,9,13,45,45,18,21,13,13,22,99,88])
print(array1[len(array1)-1])
if(array1[0]>array1[1] ):
    fh = array1[0]
    sh =array1[1]
elif(array1[0]<array1[1] ): 
    fh = array1[1]
    sh =array1[0]
for i in range(2,len(array1)):
    if(array1[i]>fh):
        sh = fh 
        fh = array1[i]
    elif((array1[i] > sh) or (array1[i] < fh)):
        fh = fh 
        sh = array1[i]
    elif((array1[i] == sh) or (array1[i] == fh)):
        continue
    elif(array1[i] < sh):
        fh = fh
        sh = sh
print("fhighest = {} and shighest = {} ".format(fh,sh))

当使用注释的array2测试时输出正确,但使用array1测试时,最大值和第二大值均显示为99,请问代码是否存在错误?


你的代码存在几处逻辑错误,导致在array1测试时出现异常结果,具体问题和修复方案如下:

核心错误点

  • 条件判断顺序颠倒:你先判断了(array1[i] > sh) or (array1[i] < fh),再判断元素是否等于最大值/第二大值。但当元素等于最大值时,array1[i] > sh必然成立(因为最大值大于第二大值),这会触发第二个分支,把第二大值sh覆盖为最大值,最终导致两者相等。
  • 逻辑运算符使用错误:第二个分支的条件应该是array1[i] > sh and array1[i] < fh(元素大于第二大值且小于最大值),而不是or。用or会导致任何小于最大值的元素都会覆盖第二大值,哪怕它比当前第二大值更小。
  • 初始判断未处理相等情况:如果数组前两个元素相等,你的初始判断会跳过赋值,导致fh和sh未定义。
  • 冗余无效代码:fh = fh、sh = sh这类代码完全没有意义,属于冗余代码。

修正后的代码

from array import *

array1 = array('i', [10,5,99,88,99,99,10,12,9,9,13,45,45,18,21,13,13,22,99])
# array2 = array('i', [10,5,99,88,99,99,10,12,9,9,13,45,45,18,21,13,13,22,99,88])

# 初始化最大值和第二大值,处理前两个元素相等的情况
if array1[0] > array1[1]:
    fh, sh = array1[0], array1[1]
elif array1[0] < array1[1]:
    fh, sh = array1[1], array1[0]
else:
    fh = sh = array1[0]

for num in array1[2:]:
    if num > fh:
        # 当前数大于最大值,更新第二大值为原最大值,最大值为当前数
        sh = fh
        fh = num
    elif num == fh:
        # 等于最大值,跳过
        continue
    elif num > sh:
        # 当前数小于最大值但大于第二大值,更新第二大值
        sh = num
    # 小于等于第二大值的情况无需处理

print(f"fhighest = {fh} and shighest = {sh} ")

修正后的逻辑说明

  • 初始化阶段补充了前两个元素相等的处理,避免变量未定义;
  • 遍历数组时先判断是否大于最大值,再判断是否等于最大值,最后判断是否大于第二大值,顺序合理;
  • 去掉了冗余代码,逻辑更简洁;
  • 使用for num in array1[2:]替代索引遍历,代码可读性更高。

测试array1时,修正后的代码会输出:fhighest = 99 and shighest = 88 ,符合预期。

内容的提问来源于stack exchange,提问作者Arvind SHa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:35:35