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

CS50课程去元音代码报IndexError: string index out of range错误求助

解决字符串去元音时的IndexError问题

错误原因分析

  1. 索引越界核心原因:你用range(len(text))设定循环次数时,取的是原始输入字符串的长度,但循环过程中通过text.replace()删除字符,导致text的实际长度不断缩短。而index一直在递增,当index超过缩短后的text长度时,text[index]就会找不到对应字符,触发IndexError: string index out of range。
  2. 额外小bug:代码最后打印的变量是user,但你定义的变量是text,这里会触发NameError。

修复后的代码方案(高效简洁版)

直接新建一个结果字符串,遍历原字符串的每个字符,非元音字符就追加到结果中,全程不修改原字符串,从根源避免索引问题:

text = input('Input: ')
result = ""
# 直接包含大小写元音,无需转小写判断
vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}
for letter in text:
    if letter not in vowels:
        result += letter
print("Output: " + result)

保留原有逻辑的修复方式

如果想沿用你原本的遍历思路,只需保存原始字符串的长度,基于原始字符串遍历,避免因修改text导致的长度变化影响循环:

text = input('Input: ')
index = 0
# 保存原始字符串,避免修改后长度改变
original_text = text
for _ in range(len(original_text)):
    letter = original_text[index]
    newletter = letter.lower()
    if newletter in {"a", "e", "i", "o", "u"}:
        text = text.replace(letter, "", 1)
    index += 1
print("Output: " + text)

方案对比

第一种方案逻辑更直观,且Python中字符串是不可变类型,每次replace()都会生成新字符串,多次调用会降低效率。直接构建结果字符串的方式时间复杂度为O(n),效率更高、更易维护。

内容的提问来源于stack exchange,提问作者Gatman333

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:32:35