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

类糖果传奇横向消除程序报错:列表索引越界问题排查

问题排查与修复:类糖果传奇消除功能的IndexError问题

错误原因分析

触发IndexError: list index out of range的核心原因有两个:

  • 遍历过程中修改列表长度:你在for i in range(len(list)-2)的循环里直接执行pop删除元素,导致列表长度动态缩短,但循环的迭代次数是基于初始列表长度计算的。比如初始列表长度为5,循环会执行3次(i=0,1,2),但如果i=0时删除了3个元素,列表长度变为2,当i=2时,i+2=4就会超出新列表的索引范围。
  • 变量名冲突:使用了Python内置类型list作为变量名,会覆盖内置函数,虽然不是直接报错原因,但属于不良编码习惯。

另外原代码还有两个逻辑缺陷:

  • 仅处理连续3个相同字符的情况,连续4个及以上(比如"aaaa")无法完全消除。
  • 消除一轮后直接结束,没有处理消除后新产生的连续相同字符(比如"aabbbaaa"消除中间bbb后变成"aaaa",需要再次消除)。

修复后的代码

采用栈结构来处理消除逻辑,这是解决此类连续消除问题的高效方案,同时修复了索引错误和逻辑缺陷:

print("Hello! Welcome to Candy Crush!")
while True:
    decision = input("Would you like to add a string? ")
    if decision.lower() == "yes":
        input_str = input("Please enter a string: ")
        candy_list = list(input_str)
        print("Your original list is", candy_list)
        print("Your original string: ", input_str)
        
        # 使用栈实现循环消除逻辑
        stack = []
        for char in candy_list:
            stack.append(char)
            # 检查栈顶3个元素是否相同,相同则弹出
            while len(stack) >= 3 and stack[-1] == stack[-2] == stack[-3]:
                # 弹出连续3个相同元素
                stack.pop()
                stack.pop()
                stack.pop()
                print("Your trimmed list is", stack)
        
        result = "".join(stack)
        print("\nThe output of your string is: ", result)
    elif decision.lower() == "no":
        print("Thank you for playing! Have a great day!")
        break
    else:
        print("Invalid input! Please enter Yes/No.")

代码改进说明

  • 栈结构消除逻辑:遍历每个字符入栈,每次入栈后检查栈顶3个元素是否相同,相同则弹出,自动处理多轮消除(包括消除后新产生的连续字符)。
  • 避免列表遍历修改:不再在循环中直接修改原列表,彻底解决索引越界问题。
  • 优化输入判断:用lower()统一转换为小写,简化判断逻辑,同时增加无效输入提示。
  • 变量名规范:改用candy_list替代内置list作为变量名,避免命名冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:46:13