CS50课程去元音代码报IndexError: string index out of range错误求助
解决字符串去元音时的IndexError问题
错误原因分析
- 索引越界核心原因:你用
range(len(text))设定循环次数时,取的是原始输入字符串的长度,但循环过程中通过text.replace()删除字符,导致text的实际长度不断缩短。而index一直在递增,当index超过缩短后的text长度时,text[index]就会找不到对应字符,触发IndexError: string index out of range。 - 额外小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
相关产品推荐
相关产品推荐

