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

为何这段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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:47:55