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
相关产品推荐
相关产品推荐

