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

已添加if条件规避,为何仍触发index out of range(索引越界)错误?

问题分析与修复

核心问题点

  • 循环索引未动态更新:range(1, len(list1))生成固定数值序列,循环中pop元素缩短列表后,后续i值会超过新列表长度,直接触发index out of range。
  • 递归+循环的逻辑冲突:每次pop后递归调用compress,但当前循环的剩余迭代仍会继续执行,此时列表已被修改,索引逻辑完全混乱。
  • 变量名笔误:第二个判断中list[i]应为list1[i],引用未定义的list会直接报错。
  • 重复处理:递归与循环叠加导致同一元素被多次处理,进一步加剧索引异常。

修复后的代码

放弃递归,改用动态索引的while循环遍历,适配列表长度变化:

def compress(list1):
    i = 1
    while i < len(list1):
        # 检查与前一个元素是否重复
        if list1[i] == list1[i-1]:
            list1.pop(i)
            continue  # pop后列表变短,留在当前索引继续检查新元素
        # 检查与后一个元素是否重复(先确保索引不越界)
        k = i + 1
        if k < len(list1) and list1[i] == list1[k]:
            list1.pop(i)
            continue
        # 无重复则索引递增
        i += 1
    return len(list1)

测试验证

用你的测试用例验证:

listA = [2,1,2,2]
result = compress(listA)
print(result)  # 输出3,最终列表为[2,1,2]

# 批量测试逻辑保持不变
nTestCases = int(input())
for i in range(nTestCases):
    size = int(input())
    Frame = []
    for j in range(size):
        Frame.append(int(input()))
    print(compress(Frame))

关键说明

  • 用while循环替代for循环,可动态调整索引值,适配列表长度变化。
  • 每次pop后不递增索引,因为当前位置的元素已被替换,需要重新检查。
  • 移除递归逻辑,避免重复处理和索引混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:55:17