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

Python列表数字处理函数触发IndexError: string index out of range求助

解决Python中"Numbers in lists"任务的IndexError问题

嘿,我来帮你搞定这个索引越界的bug!先看你遇到的错误:

IndexError: string index out of range

它出现在else分支里的while int(string[i]) <= prev:这一行,核心原因是你的内层while循环没有检查索引是否越界。

问题场景还原

比如拿测试用例'987654321'来说:

  • 一开始i=0,数字9大于初始prev=0,被加入主列表,prev更新为9,i变成1。
  • 进入else分支,此时string[1]是8,小于9,进入内层while循环:每次把数字加入sublist,i不断递增。
  • 当i递增到9时,已经等于字符串长度(len('987654321')=9),但内层while循环还会执行int(string[i]),这时候索引9超出了字符串的有效索引范围(0-8),直接触发报错。

修复方案

需要做两处关键修改:

  1. 给内层while循环加上索引越界检查,确保只有当i还在字符串范围内时,才判断数字大小;
  2. 在外层循环结束后,检查sublist是否还有未加入主列表的元素(比如字符串最后一段都是小于等于prev的数字的情况)。

修改后的完整代码如下:

def numbers_in_lists(string):
    i = 0
    prev = 0
    main_list = []  # 避免用list作为变量名,和内置类型冲突
    sublist = []
    while i < len(string):
        current_num = int(string[i])  # 提前转换数字,避免重复转换
        if current_num > prev:
            # 如果sublist有内容(比如处理完一段递减序列后遇到更大的数),先加入主列表
            if sublist:
                main_list.append(sublist)
                sublist = []
            main_list.append(current_num)
            prev = current_num
            i += 1
        else:
            # 内层循环先检查i是否越界,再判断数字大小
            while i < len(string) and int(string[i]) <= prev:
                sublist.append(int(string[i]))  # 直接转成数字,和结果格式一致
                i += 1
            # 内层循环结束后,把sublist加入主列表
            if sublist:
                main_list.append(sublist)
                sublist = []
    # 外层循环结束后,检查是否还有剩余的sublist未处理
    if sublist:
        main_list.append(sublist)
    return main_list

# 测试用例验证
string = '543987'
result = [5,[4,3],9,[8,7]]
print(repr(string), numbers_in_lists(string) == result)  # 输出True

string= '987654321'
result = [9,[8,7,6,5,4,3,2,1]]
print(repr(string), numbers_in_lists(string) == result)  # 输出True

string = '455532123266'
result = [4, 5, [5, 5, 3, 2, 1, 2, 3, 2], 6, [6]]
print(repr(string), numbers_in_lists(string) == result)  # 输出True

string = '123456789'
result = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(repr(string), numbers_in_lists(string) == result)  # 输出True

额外优化点

  • 避免用list作为变量名,它是Python内置类型,容易引发混淆;
  • 提前把字符转成整数,避免重复调用int(string[i]),提升可读性和效率;
  • 处理sublist的逻辑更严谨,确保不会遗漏任何元素。

内容的提问来源于stack exchange,提问作者K. Jankowski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:40:58