字符串索引超出范围问题 - Python

我正在尝试制作一个有损文本压缩程序,从输入中删除所有元音,除非元音是单词的第一个字母。我一直在第 6 行收到此“字符串索引超出范围”错误。请帮忙!


text = str(input('Message: '))

text = (' ' + text)


for i in range(0, len(text)):

  i = i + 1

  if str(text[i-1]) != ' ': #LINE 6

    text = text.replace('a', '')

    text = text.replace('e', '')

    text = text.replace('i', '')

    text = text.replace('o', '')

    text = text.replace('u', '')


print(text)


牛魔王的故事
浏览 413回答 3
3回答

温温酱

通过用 "" 替换任何字符来缩短字符串长度意味着如果删除一个字符,则迭代器中使用的 len(text) 比实际字符串长度长。有很多替代解决方案。例如,text_list = list(text)for i in range(1, len(text_list)):&nbsp; &nbsp; if text_list[i] in "aeiou":&nbsp; &nbsp; &nbsp; &nbsp; text_list[i] = ""text = "".join(text_list)通过将字符串转换为其复合字符的列表,您可以删除字符但保持列表长度(因为允许空元素)然后重新加入它们。请务必考虑特殊情况,例如 len(text)<2。

慕哥9229398

当您用空格替换字母时,您的单词会变短。因此len(text),如果您删除任何字母,最初的内容将超出范围。但是请注意,replace正在替换字符串中的所有匹配项,因此甚至不需要循环。使用循环的另一种方法是在循环过程中跟踪要替换的字母索引,然后在循环完成后进行替换。

GCT1015

正如busybear指出的那样,循环不是必需的:您的替换不依赖于i.这是我的做法:def strip_vowels(s): # Remove all vowels from a string&nbsp; &nbsp; for v in 'aeiou':&nbsp; &nbsp; &nbsp; &nbsp; s = s.replace(v, '')&nbsp; &nbsp; return sdef compress_word(s):&nbsp; &nbsp; if not s: return '' # Needed to avoid an out-of-range error on the empty string&nbsp; &nbsp; return s[0] + strip_vowels(s[1:]) # Strip vowels from all but the first letterdef compress_text(s): # Apply to each word&nbsp; &nbsp; words = text.split(' ')&nbsp; &nbsp; new_words = compress_word(w) for w in words&nbsp; &nbsp; return ' '.join(new_words)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python