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

Python列表求最大值、计数及最后最大值索引的sort错误修复

问题根因

原代码的核心错误是对存储原始输入的列表直接调用sort()方法,该方法会原地修改列表元素顺序,排序后所有最大值都会被移动到列表尾部,此时计算得到的索引完全不对应原始列表的位置,后续不管是用index()取第一个匹配项、还是直接取列表长度减1当最后一个最大值索引,结果都是错的。

举个直观的错误例子:输入为3 1 4 4 2时,原始列表最后一个最大值4的索引是3;原代码排序后列表变为[1,2,3,4,4],最终输出的索引是4,和正确结果不符。

另外原代码重复调用max(a)、a.count(max(a)),每次调用都会遍历一次全列表,存在不必要的性能损耗。

修复方案

实现这个需求完全不需要对列表做排序,排序属于多余操作。最优实现是单次遍历原列表,过程中同步维护最大值、最大值出现次数、最后一个最大值的索引三个变量,全程不修改原列表,时间复杂度仅为O(n)。

a = [int(s) for s in input().split()]
# 初始化参数,默认取第一个元素为初始最大值
max_val = a[0]
max_count = 1
last_max_idx = 0

for idx, num in enumerate(a[1:], start=1):
    if num > max_val:
        # 遇到更大的值,重置所有统计参数
        max_val = num
        max_count = 1
        last_max_idx = idx
    elif num == max_val:
        # 遇到重复最大值,更新计数和最后出现的索引
        max_count += 1
        last_max_idx = idx

print(max_val, max_count, last_max_idx)

可选偷懒写法

如果不想手动写遍历逻辑,也可以直接用Python内置方法计算,注意不要修改原列表,最后一个最大值的索引通过反向切片查找实现,逻辑正确但效率比单次遍历稍差:

a = [int(s) for s in input().split()]
max_val = max(a)
max_count = a.count(max_val)
# 反转列表后找第一个最大值的位置,换算成原列表的正向索引
last_max_idx = len(a) - 1 - a[::-1].index(max_val)
print(max_val, max_count, last_max_idx)
修复要点
  • 移除无意义的a.sort()调用,从根源避免原始列表顺序被破坏
  • 所有索引计算都基于未修改的原始输入列表,不会出现位置偏移错误
  • 减少冗余的全列表遍历操作,提升执行效率
  • 不需要额外写分支判断最大值出现1次还是多次,遍历/反向查找逻辑天然覆盖所有情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:09:17