Python简单列表处理程序报错IndexError: list index out of range排查
问题原因及修复方案
核心错误原因
- 索引取值逻辑错误
你预先收集的comma_index_ask列表里存储的本身就是逗号在原字符列表中的索引值,比如输入a,b,c时这个列表为[1, 3]。循环中你写的comma_index_ask[item]相当于把原列表的索引值又当成了comma_index_ask的下标来取值,当item的值大于等于comma_index_ask的长度时就会触发索引越界。比如示例中第二次循环item=3,而comma_index_ask只有2个元素,最大下标是1,取comma_index_ask[3]直接报错。 - 正序删除列表元素会导致索引偏移
就算你把代码改成直接list.pop(item),也会出现错误。删除前面的元素后列表长度会变短,后面所有元素的索引都会自动减1,你按原列表收集的索引删后面的元素时,要么删错位置要么越界。比如原列表删了索引1的逗号后,原来索引3的逗号就移到了索引2的位置,你再按原索引3去删就会越界。 - 额外不规范问题:你用了Python内置关键字
list作为变量名,会覆盖原本的列表类型定义,建议改名避免后续出现隐性BUG。
修复方案
方案1:倒序删除逗号索引
倒序删除不会影响前面未删除元素的索引,同时直接使用收集到的索引值即可:
question = input(">") def split_str(question): return [char for char in question] char_list = split_str(question) print(char_list) comma_index_ask = [i for i in range(len(char_list)) if char_list[i] == ","] print(comma_index_ask) # 倒序遍历索引列表删除 for item in reversed(comma_index_ask): char_list.pop(item) print(char_list)
方案2:直接过滤逗号(更简洁高效)
不需要先收集索引再删除,直接在生成字符列表时过滤掉逗号即可:
question = input(">") char_list = [char for char in question if char != ","] print(char_list)
内容的提问来源于stack exchange,提问作者Georgi Rumenov
相关产品推荐
相关产品推荐

