Python 'list indices must be integers, not tuple"

To create list of lists, you need to separate them with commas, like this

coin_args = [
    ["pennies", '2.5', '50.0', '.01'],
    ["nickles", '5.0', '40.0', '.05'],
    ["dimes", '2.268', '50.0', '.1'],
    ["quarters", '5.67', '40.0', '.25']
]

Why does the error mention tuples?

Others have explained that the problem was the missing ,, but the final mystery is why does the error message talk about tuples?

As mentioned by 6502 the code:

coin_args = [
  ["pennies", '2.5', '50.0', '.01'] 
  ["nickles", '5.0', '40.0', '.05']
]

has the exact same problem as:

coin_args = [
  ["pennies", '2.5', '50.0', '.01']["nickles", '5.0', '40.0', '.05']
]

which has the same problem as:

mylist = ["pennies", '2.5', '50.0', '.01']
coin_args = [
  mylist["nickles", '5.0', '40.0', '.05']
]

which has the same problem as:

mylist = [1, 2]
print(mylist[3, 4])

When you do mylist[0], that calls __getitem__, which deals with [] resolution.

But Python syntax also allows you to pass two arguments in general, e.g.: object[1, 2]. When that happens, __getitem__ receives a tuple:

class C(object):
    def __getitem__(self, k):
        return k

# Single argument is passed directly.
assert C()[0] == 0

# Multiple indices generate a tuple.
assert C()[0, 1] == (0, 1)

The problem is that the __getitem__ for the list built-in class cannot deal with tuple arguments like that, only integers, and so in complains:

TypeError: list indices must be integers, not tuple

You could however implement __getitem__ in your own classes such that myobject[1, 2] does something sensible.

More examples of __getitem__ action at: https://stackoverflow.com/a/33086813/895245


The problem is that [...] in python has two distinct meanings

  1. expr [ index ] means accessing an element of a list
  2. [ expr1, expr2, expr3 ] means building a list of three elements from three expressions

In your code you forgot the comma between the expressions for the items in the outer list:

[ [a, b, c] [d, e, f] [g, h, i] ]

therefore Python interpreted the start of second element as an index to be applied to the first and this is what the error message is saying.

The correct syntax for what you're looking for is

[ [a, b, c], [d, e, f], [g, h, i] ]

Tags:

Python

List