Hans Starkiller
Hans Starkiller

Reputation: 1

String Index Out of Range Issue - Python

I am trying to make a lossy text compression program that removes all vowels from the input, except for if the vowel is the first letter of a word. I keep getting this "string index out of range" error on line 6. Please help!

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)

Upvotes: 0

Views: 279

Answers (3)

Draconis
Draconis

Reputation: 3461

As busybear notes, the loop isn't necessary: your replacements don't depend on i.

Here's how I'd do it:

def strip_vowels(s): # Remove all vowels from a string
    for v in 'aeiou':
        s = s.replace(v, '')
    return s

def compress_word(s):
    if not s: return '' # Needed to avoid an out-of-range error on the empty string
    return s[0] + strip_vowels(s[1:]) # Strip vowels from all but the first letter

def compress_text(s): # Apply to each word
    words = text.split(' ')
    new_words = compress_word(w) for w in words
    return ' '.join(new_words)

Upvotes: 1

NaT3z
NaT3z

Reputation: 344

Shortening your string length by replacing any char with "" means that if you remove a character, len(text) used in your iterator is longer than the actual string length. There are plenty of alternative solutions. for example,

text_list = list(text)
for i in range(1, len(text_list)):
    if text_list[i] in "aeiou":
        text_list[i] = ""
text = "".join(text_list)

By turning your string into a list of its composite characters, you can remove characters but maintain the list length (since empty elements are allowed) then rejoin them.

Be sure to account for special cases, such as len(text)<2.

Upvotes: 0

busybear
busybear

Reputation: 10590

When you replace letters with a blank, your word gets shorter. So what was originally len(text) is going to be out of bounds if you remove any letters. Do note however, replace is replacing all occurrences within your string, so a loop isn't even necessary.

An alternative to use the loop is to just keep track of the index of letters to replace while going through the loop, then replace after the loop is complete.

Upvotes: 0

Related Questions