I’m currently learning python from a book called ‘Python for the absolute beginner (third edition)’. There is an exercise in the book which outlines code for a hangman game. I followed along with this code however I keep getting back an error in the middle of the program.
Here is the code that is causing the problem:
if guess in word:
print("nYes!", guess, "is in the word!")
# Create a new variable (so_far) to contain the guess
new = ""
i = 0
for i in range(len(word)):
if guess == word[i]:
new += guess
else:
new += so_far[i]
so_far = new
This is also the error it returns:
new += so_far[i]
IndexError: string index out of range
Could someone help me out with what is going wrong and what I can do to fix it?
edit: I initialised the so_far variable like so:
so_far = "-" * len(word)
asked Jan 3, 2012 at 12:58
DarkphenomDarkphenom
6472 gold badges8 silver badges14 bronze badges
2
It looks like you indented so_far = new
too much. Try this:
if guess in word:
print("nYes!", guess, "is in the word!")
# Create a new variable (so_far) to contain the guess
new = ""
i = 0
for i in range(len(word)):
if guess == word[i]:
new += guess
else:
new += so_far[i]
so_far = new # unindented this
answered Jan 3, 2012 at 13:25
Rob WoutersRob Wouters
15.7k3 gold badges42 silver badges36 bronze badges
1
You are iterating over one string (word
), but then using the index into that to look up a character in so_far
. There is no guarantee that these two strings have the same length.
answered Jan 3, 2012 at 13:00
unwindunwind
390k64 gold badges468 silver badges605 bronze badges
This error would happen when the number of guesses (so_far) is less than the length of the word. Did you miss an initialization for the variable so_far somewhere, that sets it to something like
so_far = " " * len(word)
?
Edit:
try something like
print "%d / %d" % (new, so_far)
before the line that throws the error, so you can see exactly what goes wrong. The only thing I can think of is that so_far is in a different scope, and you’re not actually using the instance you think.
answered Jan 3, 2012 at 13:02
CNeoCNeo
7261 gold badge6 silver badges10 bronze badges
3
There were several problems in your code.
Here you have a functional version you can analyze (Lets set ‘hello’ as the target word):
word = 'hello'
so_far = "-" * len(word) # Create variable so_far to contain the current guess
while word != so_far: # if still not complete
print(so_far)
guess = input('>> ') # get a char guess
if guess in word:
print("nYes!", guess, "is in the word!")
new = ""
for i in range(len(word)):
if guess == word[i]:
new += guess # fill the position with new value
else:
new += so_far[i] # same value as before
so_far = new
else:
print("try_again")
print('finish')
I tried to write it for py3k with a py2k ide, be careful with errors.
answered Jan 3, 2012 at 13:33
joaquinjoaquin
82.3k29 gold badges138 silver badges152 bronze badges
1
Like lists, Python strings are indexed. This means each value in a string has its own index number which you can use to access that value. If you try to access an index value that does not exist in a string, you’ll encounter a “TypeError: string index out of range” error.
In this guide, we discuss what this error means and why it is raised. We walk through an example of this error in action to help you figure out how to solve it.
Find Your Bootcamp Match
- Career Karma matches you with top tech bootcamps
- Access exclusive scholarships and prep courses
Select your interest
First name
Last name
Phone number
By continuing you agree to our Terms of Service and Privacy Policy, and you consent to receive offers and opportunities from Career Karma by telephone, text message, and email.
TypeError: string index out of range
In Python, strings are indexed starting from 0. Take a look at the string “Pineapple”:
P | i | n | e | a | p | p | l | e |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
“Pineapple” contains nine letters. Because strings are indexed from 0, the last letter in our string has the index number 8. The first letter in our string has the index number 0.
If we try to access an item at position 9 in our list, we’ll encounter an error. This is because there is no letter at index position 9 for Python to read.
The “TypeError: string index out of range” error is common if you forget to take into account that strings are indexed from 0. It’s also common in for loops that use a range() statement.
Example Scenario: Strings Are Indexed From 0
Take a look at a program that prints out all of the letters in a string on a new line:
def print_string(sentence): count = 0 while count <= len(sentence): print(sentence[count]) count += 1
Our code uses a while loop to loop through every letter in the variable “sentence”. Each time a loop executes, our variable “count” is increased by 1. This lets us move on to the next letter when our loop continues.
Let’s call our function with an example sentence:
Our code returns:
S t r i n g Traceback (most recent call last): File "main.py", line 8, in <module> print_string("test") File "main.py", line 5, in print_string print(sentence[count]) IndexError: string index out of range
Our code prints out each character in our string. After every character is printed, an error is raised. This is because our while loop continues until “count” is no longer less than or equal to the length of “sentence”.
To solve this error, we must ensure our while loop only runs when “count” is less than the length of our string. This is because strings are indexed from 0 and the len()
method returns the full length of a string. So, the length of “string” is 6. However, there is no character at index position 6 in our string.
Let’s revise our while loop:
while count < len(sentence):
This loop will only run while the value of “count” is less than the length of “sentence”.
Run our code and see what happens:
Our code runs successfully!
Example Scenario: Hamming Distance Program
Here, we write a program that calculates the Hamming Distance between two sequences. This tells us how many differences there are between two strings.
Start by defining a function that calculates the Hamming distance:
def hamming(a, b): differences = 0 for c in range(0, len(a)): if a[c] != b[c]: differences += 1 return differences
Our function accepts two arguments: a and b. These arguments contain the string values that we want to compare.
In our function, we use a for loop to go through each position in our strings to see if the characters at that position are the same. If they are not the same, the “differences” counter is increased by one.
Call our function and try it out with two strings:
answer = hamming("Tess1", "Test") print(answer)
Run our code and see what happens:
Traceback (most recent call last): File "main.py", line 10, in <module> answer = hamming("Tess1", "Test") File "main.py", line 5, in hamming if a[c] != b[c]: IndexError: string index out of range
Our code returns an error. This is because “a” and “b” are not the same length. “a” has one more character than “b”. This causes our loop to try to find another character in “b” that does not exist even after we’ve searched through all the characters in “b”.
We can solve this error by first checking if our strings are valid:
def hamming(a, b): differences = 0 if len(a) != len(b): print("Strings must be the same length.") return for c in range(0, len(a)): if a[c] != b[c]: differences += 1 return differences
We’ve used an “if” statement to check if our strings are the same length. If they are, our program will run. If they are not, our program will print a message to the console and our function will return a null value to our main program. Run our code again:
Strings must be the same length. None
Our code no longer returns an error. Try our algorithm on strings that have the same length:
«Career Karma entered my life when I needed it most and quickly helped me match with a bootcamp. Two months after graduating, I found my dream job that aligned with my values and goals in life!»
Venus, Software Engineer at Rockbot
answer = hamming("Test", "Tess") print(answer)
Our code returns: 1. Our code has successfully calculated the Hamming Distance between the strings “Test” and “Tess”.
Conclusion
The “TypeError: string index out of range” error is raised when you try to access an item at an index position that does not exist. You solve this error by making sure that your code treats strings as if they are indexed from the position 0.
Now you’re ready to solve this common Python error like a professional coder!
I keep getting an «IndexError: string index out of range» error message when I try to execute this code:
#function countLetters(word,letter) should count the number of times
#a particular letter appears in a word.
def countLetters(word, letter):
count=0
wordlen=len(word)
num=0
wordletter=""
while(num<=wordlen):
wordletter=word[num]
if(wordletter==letter):
count=count+1
num=num+1
return count
print(countLetters("banana", "x"))#should print 0
print(countLetters("banana", "a"))#should print 3
print(countLetters("banana", "b"))#should print 1
The Error Message:
Traceback (most recent call last):
File "C:UsersCharlie ChiangDesktop9G.py", line 17, in <module>
print(countLetters("banana", "x"))
File "C:UsersCharlie ChiangDesktop9G.py", line 10, in countLetters
var=word[num]
IndexError: string index out of range
Find Your Bootcamp Match
- Career Karma matches you with top tech bootcamps
- Access exclusive scholarships and prep courses
Select your interest
First name
Last name
Phone number
By continuing you agree to our Terms of Service and Privacy Policy, and you consent to receive offers and opportunities from Career Karma by telephone, text message, and email.
TypeError: string index out of range
In Python, strings are indexed starting from 0. Take a look at the string “Pineapple”:
P | i | n | e | a | p | p | l | e |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
“Pineapple” contains nine letters. Because strings are indexed from 0, the last letter in our string has the index number 8. The first letter in our string has the index number 0.
If we try to access an item at position 9 in our list, we’ll encounter an error. This is because there is no letter at index position 9 for Python to read.
The “TypeError: string index out of range” error is common if you forget to take into account that strings are indexed from 0. It’s also common in for loops that use a range() statement.
Example Scenario: Strings Are Indexed From 0
Take a look at a program that prints out all of the letters in a string on a new line:
def print_string(sentence): count = 0 while count <= len(sentence): print(sentence[count]) count += 1
Our code uses a while loop to loop through every letter in the variable “sentence”. Each time a loop executes, our variable “count” is increased by 1. This lets us move on to the next letter when our loop continues.
Let’s call our function with an example sentence:
Our code returns:
S t r i n g Traceback (most recent call last): File "main.py", line 8, in <module> print_string("test") File "main.py", line 5, in print_string print(sentence[count]) IndexError: string index out of range
Our code prints out each character in our string. After every character is printed, an error is raised. This is because our while loop continues until “count” is no longer less than or equal to the length of “sentence”.
To solve this error, we must ensure our while loop only runs when “count” is less than the length of our string. This is because strings are indexed from 0 and the len()
method returns the full length of a string. So, the length of “string” is 6. However, there is no character at index position 6 in our string.
Let’s revise our while loop:
while count < len(sentence):
This loop will only run while the value of “count” is less than the length of “sentence”.
Run our code and see what happens:
Our code runs successfully!
Example Scenario: Hamming Distance Program
Here, we write a program that calculates the Hamming Distance between two sequences. This tells us how many differences there are between two strings.
Start by defining a function that calculates the Hamming distance:
def hamming(a, b): differences = 0 for c in range(0, len(a)): if a[c] != b[c]: differences += 1 return differences
Our function accepts two arguments: a and b. These arguments contain the string values that we want to compare.
In our function, we use a for loop to go through each position in our strings to see if the characters at that position are the same. If they are not the same, the “differences” counter is increased by one.
Call our function and try it out with two strings:
answer = hamming("Tess1", "Test") print(answer)
Run our code and see what happens:
Traceback (most recent call last): File "main.py", line 10, in <module> answer = hamming("Tess1", "Test") File "main.py", line 5, in hamming if a[c] != b[c]: IndexError: string index out of range
Our code returns an error. This is because “a” and “b” are not the same length. “a” has one more character than “b”. This causes our loop to try to find another character in “b” that does not exist even after we’ve searched through all the characters in “b”.
We can solve this error by first checking if our strings are valid:
def hamming(a, b): differences = 0 if len(a) != len(b): print("Strings must be the same length.") return for c in range(0, len(a)): if a[c] != b[c]: differences += 1 return differences
We’ve used an “if” statement to check if our strings are the same length. If they are, our program will run. If they are not, our program will print a message to the console and our function will return a null value to our main program. Run our code again:
Strings must be the same length. None
Our code no longer returns an error. Try our algorithm on strings that have the same length:
«Career Karma entered my life when I needed it most and quickly helped me match with a bootcamp. Two months after graduating, I found my dream job that aligned with my values and goals in life!»
Venus, Software Engineer at Rockbot
answer = hamming("Test", "Tess") print(answer)
Our code returns: 1. Our code has successfully calculated the Hamming Distance between the strings “Test” and “Tess”.
Conclusion
The “TypeError: string index out of range” error is raised when you try to access an item at an index position that does not exist. You solve this error by making sure that your code treats strings as if they are indexed from the position 0.
Now you’re ready to solve this common Python error like a professional coder!
I keep getting an «IndexError: string index out of range» error message when I try to execute this code:
#function countLetters(word,letter) should count the number of times
#a particular letter appears in a word.
def countLetters(word, letter):
count=0
wordlen=len(word)
num=0
wordletter=""
while(num<=wordlen):
wordletter=word[num]
if(wordletter==letter):
count=count+1
num=num+1
return count
print(countLetters("banana", "x"))#should print 0
print(countLetters("banana", "a"))#should print 3
print(countLetters("banana", "b"))#should print 1
The Error Message:
Traceback (most recent call last):
File "C:UsersCharlie ChiangDesktop9G.py", line 17, in <module>
print(countLetters("banana", "x"))
File "C:UsersCharlie ChiangDesktop9G.py", line 10, in countLetters
var=word[num]
IndexError: string index out of range
f.rodrigues
3,4596 gold badges25 silver badges62 bronze badges
asked Jul 16, 2014 at 22:09
4
You take it one index too far:
while(num<=wordlen):
num
must stay strictly below the length:
while num < wordlen:
because Python sequences are 0-based. A string of length 5 has indices 0, 1, 2, 3, and 4, not 5.
answered Jul 16, 2014 at 22:12
Martijn Pieters♦Martijn Pieters
1.0m295 gold badges4031 silver badges3325 bronze badges
1
You are reaching one index too far:
while(num<=wordlen):
For a text «a» the len(«a») is 1 and last letter can be reached by index 0. Your while condition allows trying index 1, which is not available.
Bonus: counting using Counter
Python stdlib collections
provides excellent Counter
:
>>> from collections import Counter
>>> Counter("banana").get("x", 0)
0
>>> Counter("banana").get("a", 0)
3
answered Jul 16, 2014 at 22:14
Jan VlcinskyJan Vlcinsky
42.4k12 gold badges101 silver badges98 bronze badges
Fixing your code:
def countLetters(word, letter):
count=0
wordlen=len(word)
num=0
wordletter=""
#here, because the index access is 0-based
#you have to test if the num is less than, not less than or equal to length
#last index == len(word) -1
while(num<wordlen):
wordletter=word[num]
if(wordletter==letter):
count=count+1
num=num+1
return count
print(countLetters("banana", "x"))#should print 0
print(countLetters("banana", "a"))#should print 3
print(countLetters("banana", "b"))#should print 1
more elegant way:
str.count
method
'banana'.count('x')
'banana'.count('a')
'banana'.count('b')
answered Jul 16, 2014 at 22:16
Rafael BarrosRafael Barros
2,7271 gold badge21 silver badges27 bronze badges
0
Because the index of the string starts at zero, the highest valid index will be wordlen-1.
answered Jul 16, 2014 at 22:14
CCKxCCKx
1,28310 silver badges22 bronze badges
The index start at 0, not 1.
Try changing:
wordletter = word[num-1]
answered Jul 16, 2014 at 22:15
f.rodriguesf.rodrigues
3,4596 gold badges25 silver badges62 bronze badges
1
In this Python tutorial, we will discuss how to fix the error indexerror: string index out of range in Python. We will check how to fix the error indexerror string index out of range python 3.
In python, an indexerror string index out of range python error occurs when a character is retrieved by an index that is outside the range of string value, and the string index starts from ” 0 “ to the total number of the string index values.
Example:
name = "Jack"
value = name[4]
print(value)
After writing the above code (string index out of range), Ones you will print “ value” then the error will appear as an “ IndexError: string index out of range ”. Here, the index with name[4] is not in the range, so this error arises because the index value is not present and it is out of range.
You can refer to the below screenshot for string index out of range
This is IndexError: string index out of range.
To solve this IndexError: string index out of range we need to give the string index in the range so that this error can be resolved. The index starts from 0 and ends with the number of characters in the string.
Example:
name = "Jack"
value = name[2]
print('The character is: ',value)
After writing the above code IndexError: string index out of range this is resolved by giving the string index in the range, Here, the index name[2] is in the range and it will give the output as ” The character is: c ” because the specified index value and the character is in the range.
You can refer to the below screenshot on how to solve the IndexError: string index out of range.
So, the IndexError is resolved string index out of range.
You may like the following Python tutorials:
- SyntaxError: Unexpected EOF while parsing
- ValueError: Invalid literal for int() with base 10 in Python
This is how to solve IndexError: string index out of range in Python or indexerror string index out of range Python 3.
I am Bijay Kumar, a Microsoft MVP in SharePoint. Apart from SharePoint, I started working on Python, Machine learning, and artificial intelligence for the last 5 years. During this time I got expertise in various Python libraries also like Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… for various clients in the United States, Canada, the United Kingdom, Australia, New Zealand, etc. Check out my profile.
The python error IndexError: string index out of range occurs if a character is not available at the string index. The string index value is out of range of the String length. The python error IndexError: string index out of range occurs when a character is retrieved from the out side index of the string range.
The IndexError: string index out of range error occurs when attempting to access a character using the index outside the string index range. To identify a character in the string, the string index is used. This error happens when access is outside of the string’s index range.
If the character is retrieved by an index that is outside the range of the string index value, the python interpreter can not locate the location of the memory. The string index starts from 0 to the total number of characters in the string. If the index is out of range, It throws the error IndexError: string index out of range.
A string is a sequence of characters. The characters are retrieved by the index. The index is a location identifier for the ordered memory location where character is stored. A string index starts from 0 to the total number of characters in the string.
Exception
The IndexError: string index out of range error will appear as in the stack trace below. Stack trace shows the line the error has occurred at.
Traceback (most recent call last):
File "/Users/python/Desktop/test.py", line 2, in <module>
print ("the value is ", x[6])
IndexError: string index out of range
[Finished in 0.1s with exit code 1]
Root cause
The character in the string is retrieved via the character index. If the index is outside the range of the string index the python interpreter can’t find the character from the location of the memory. Thus it throws an error on the index. The string index starts from 0 and ends with the character number in the string.
Forward index of the string
Python allows two forms of indexing, forward indexing and backward indexing. The forward index begins at 0 and terminates with the number of characters in the string. The forward index is used to iterate a character in the forward direction. The character in the string will be written in the same index order.
Index | 0 | 1 | 2 | 3 | 4 |
Value | a | b | c | d | e |
Backward index of the string
Python allows backward indexing. The reverse index starts from-1 and ends with the negative value of the number of characters in the string. The backward index is used to iterate the characters in the opposite direction. In the reverse sequence of the index, the character in the string is printed. The back index is as shown below
Index | -5 | -4 | -3 | -2 | -1 |
Value | a | b | c | d | e |
Solution 1
The index value should be within the range of String. If the index value is out side the string index range, the index error will be thrown. Make sure that the index range is with in the index range of the string.
The string index range starts with 0 and ends with the number of characters in the string. The reverse string index starts with -1 and ends with negative value of number of characters in the string.
In the example below, the string contains 5 characters “hello”. The index value starts at 0 and ends at 4. The reverse index starts at -1 and ends at -5.
Program
x = "hello"
print "the value is ", x[5]
Output
Traceback (most recent call last):
File "/Users/python/Desktop/test.py", line 2, in <module>
print "the value is ", x[5]
IndexError: string index out of range
[Finished in 0.0s with exit code 1]
Solution
x = "hello"
print "the value is ", x[4]
Output
the value is o
[Finished in 0.1s]
Solution 2
If the string is created dynamically, the string length is unknown. The string is iterated and the characters are retrieved based on the index. In this case , the value of the index is unpredictable. If an index is used to retrieve the character in the string, the index value should be validated with the length of the string.
The len() function in the string returns the total length of the string. The value of the index should be less than the total length of the string. The error IndexError: string index out of range will be thrown if the index value exceeds the number of characters in the string
Program
x = "hello"
index = 5
print "the value is ", x[index]
Output
Traceback (most recent call last):
File "/Users/python/Desktop/test.py", line 3, in <module>
print "the value is ", x[index]
IndexError: string index out of range
[Finished in 0.1s with exit code 1]
Solution
x = "hello"
index = 4
if index < len(x) :
print "the value is ", x[index]
Output
the value is o
[Finished in 0.1s]
Solution 3
Alternatively, the IndexError: string index out of range error is handled using exception handling. The try block is used to handle if there is an index out of range error.
x = "hello"
print "the value is ", x[5]
Exception
the value is
Traceback (most recent call last):
File "/Users/python/Desktop/test.py", line 2, in <module>
print "the value is ", x[5]
IndexError: string index out of range
[Finished in 0.1s with exit code 1]
Solution
try:
x = "hello"
print "the value is ", x[5]
except:
print "not available"
Output
the value is not available
[Finished in 0.1s]