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),直接触发报错。
修复方案
需要做两处关键修改:
- 给内层while循环加上索引越界检查,确保只有当
i还在字符串范围内时,才判断数字大小; - 在外层循环结束后,检查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
相关产品推荐
相关产品推荐

