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

