Robert Rodriguez
Robert Rodriguez

Reputation: 67

Cant figure out why im getting IndexError: string index out of range python

so Im working on a codesignal problem, and these are the instructions:

Given a string, your task is to replace each of its characters by the next one in the English alphabet; i.e. replace a with b, replace b with c, etc (z would be replaced by a).

Example

For inputString = "crazy", the output should be alphabeticShift(inputString) = "dsbaz".

Input/Output

[execution time limit] 4 seconds (py3)

[input] string inputString

A non-empty string consisting of lowercase English characters.

Guaranteed constraints:
1 ≤ inputString.length ≤ 1000.

[output] string

The resulting string after replacing each of its characters.

this is my code:

def alphabeticShift(inputString):
    abc = "abcdefghijklmnopqrstuvwxyza"
    newString = ""
    for letter in inputString:
        abcIndex = 0
        for abcletter in abc:
          
          if letter == abcletter:
              newString = newString+abc[abcIndex+1]
          abcIndex = abcIndex+1
    return newString

print(alphabeticShift("*_fArgs_uiutgbodsupy"))

I have tried my code in replit and it executes just fine but I keep getting this error when I put it in codesignal:

Traceback (most recent call last):

  File main.py3 in the pre-written template, in getUserOutputs
    userOutput = _rundngpj(testInputs[i])

  File main.py3 in the pre-written template, in _rundngpj
    return alphabeticShift(*_fArgs_asixuqfdhzqc)

  File main.py3 on line 10, in alphabeticShift
    newString = newString+abc[abcIndex+1]
IndexError: string index out of range

I dont know what I am missing as i dont see how anything could be out of range?

Upvotes: 1

Views: 253

Answers (2)

Amadan
Amadan

Reputation: 198334

You don't exit your for abcLetter loop after having found a letter, and a is there twice. So when letter is "a", you add "b", then you continue to loop, find the other "a" and try to add the letter after it as well — but there is none. A break after you append the letter will fix it.

That said, there is much here that is non-idiomatic, the solution can be much simpler — e.g. by using str.translate:

shift = str.maketrans(
  'abcdefghijklmnopqrstuvwxyz',
  'bcdefghijklmnopqrstuvwxyza',
)
def alphabeticShift(inputString):
    return inputString.translate(shift)

Upvotes: 1

DeGo
DeGo

Reputation: 791

Add a break statement inside the if condition.

if letter == abcletter:
    newString = newString+abc[abcIndex+1]
    break

The reason it fails is when you encounter a, you are trying to replace it twice, once at the start and once in the end of abc which fails.

Upvotes: 4

Related Questions