Why am I seeing "TypeError: string indices must be integers"?
item is a string. An index looks like this:
'helloworld'print mystring'h'mystring =
The above example uses the
0 index of the string to refer to the first character.
Strings can't have string indices (like dictionaries can). So this won't work:
'helloworld'print mystring['stringindex']TypeError: string indices must be integersmystring =
item is most likely a string in your code; the string indices are the ones in the square brackets, e.g.,
gravatar_id. So I'd first check your
data variable to see what you received there; I guess that
data is a list of strings (or at least a list containing at least one string) while it should be a list of dictionaries.
TypeError for Slice Notation
Use a colon
: instead of a comma in between the two indices
str[a:b] (e.g. instead of
When working with strings and slice notation (a common sequence operation), it can happen that a
TypeError is raised, pointing out that the indices must be integers, even if they obviously are.
"hello world"my_string[0,5]TypeError: string indices must be integersmy_string =
We obviously passed two integers for the indices to the slice notation, right? So what is the problem here?
This error can be very frustrating - especially at the beginning of learning Python - because the error message is a little bit misleading.
We implicitly passed a tuple of two integers (0 and 5) to the slice notation when we called
0,5 (even without the parentheses) evaluates to the same tuple as
(0,5) would do.
, is actually enough for Python to evaluate something as a tuple:
0,type(my_variable)<class 'tuple'>my_variable =
So what we did there, this time explicitly:
"hello world"my_tuple = 0, 5my_string[my_tuple]TypeError: string indices must be integersmy_string =
Now, at least, the error message makes sense.
We need to replace the comma
, with a colon
: to separate the two integers correctly:
"hello world"my_string[0:5]'hello'my_string =
A clearer and more helpful error message could have been something like:
TypeError: string indices must be integers (not tuple)
A good error message shows the user directly what they did wrong and it would have been more obvious how to solve the problem.
[So the next time when you find yourself responsible for writing an error description message, think of this example and add the reason or other useful information to error message to let you and maybe other people understand what went wrong.]
- slice notation uses colons
:to separate its indices (and step range, e.g.
- tuples are defined by commas
t = 1,)
- add some information to error messages for users to understand what went wrong
Cheers and happy programming
[I know this question was already answered and this wasn't exactly the question the thread starter asked, but I came here because of the above problem which leads to the same error message. At least it took me quite some time to find that little typo.
So I hope that this will help someone else who stumbled upon the same error and saves them some time finding that tiny mistake.]