为何这段Python字符串去重代码触发IndexError: string index out of range?
字符串去重代码的IndexError问题解析
问题概述
编写字符串去重代码时触发IndexError: string index out of range错误,代码及报错信息如下:
原代码
new_str = input() for j in range(len(new_str)): for k in range(j+1, len(new_str)): if new_str[j] == new_str[k]: new_str = new_str[:k] + new_str[k+1:] print(new_str)
翻译后的报错信息
回溯(最近的调用最后): 文件 "/tmp/submission/20230712/16/14/hackerrank-253aaa8879419e0d201489ccb06df6d8/code/Solution.py", 第17行,在 <module> 中 merge_the_tools(string, k) 文件 "/tmp/submission/20230712/16/14/hackerrank-253aaa8879419e0d201489ccb06df6d8/code/Solution.py", 第7行,在 merge_the_tools 中 if new_str[j]==new_str[k]: ~~~~~~~^^^ IndexError: 字符串索引超出范围
错误原因
核心问题是循环范围基于初始字符串长度计算,但循环过程中修改了字符串的实际长度:
- 外层循环的
j基于初始new_str的长度生成范围,但删除字符后new_str长度变短,当j遍历到初始长度的后半段时,new_str[j]的索引已超出当前字符串的实际长度。 - 内层循环的
k同理:删除第k位字符后,后续的k值仍基于初始长度生成,此时new_str[k]必然会越界。
修复方案
方案1:遍历字符串副本,避免循环范围受修改影响
new_str = input() # 遍历初始字符串的副本,确保循环范围不受原字符串修改影响 for char in new_str[:]: # 重复删除该字符的后续出现项,直到只剩一次 while new_str.count(char) > 1: duplicate_idx = new_str.index(char, new_str.index(char) + 1) new_str = new_str[:duplicate_idx] + new_str[duplicate_idx+1:] print(new_str)
方案2:利用有序集合去重(Python 3.7+)
最简洁的方式,利用Python 3.7及以上版本字典的插入有序特性去重:
new_str = input() result = ''.join(dict.fromkeys(new_str)) print(result)
方案3:用集合记录已出现字符,高效构建结果
兼顾效率和可读性的通用方案:
new_str = input() seen = set() result_list = [] for char in new_str: if char not in seen: seen.add(char) result_list.append(char) print(''.join(result_list))
内容的提问来源于stack exchange,提问作者adithya
相关产品推荐
相关产品推荐

