Python 'list indices must be integers, not tup

2019-01-28 07:39发布

I'm working on moving a robot around a 2d grid room of 8 x 8, and one part is initialising the sensors which consist of the closest 5 tiles around the robot.

self.sensors = [0 for x in xrange(5)]

here I'm creating an empty of array of 5 elements.

but when I attempt to set the value of sensors like this:

    if self.heading == 'East':
        self.sensors[0] = self.room[self.x, self.y-1]
        self.sensors[1] = self.room[self.x+1, self.y-1]
        self.sensors[2] = self.room[self.x+1, self.y]
        self.sensors[3] = self.room[self.x+1, self.y+1]
        self.sensors[4] = self.room[self.x, self.y+1]

I get the error of 'list indices must be integers, not tuples'.

6条回答
Animai°情兽
2楼-- · 2019-01-28 08:08

The problem comes from your self.room.

Beacuse this:

self.room[self.x, self.y-1]

Is the same of:

self.room[(self.x, self.y-1)]

And that's your tuple error.

There are two possibilities:

  • self.room is a 2D array, which means that you probably meant something like:

    self.room[self.x][self.y-1]
    
  • you wanted to slice self.room:

    self.room[self.x:self.y-1]
    

Please provide more information about self.room.

查看更多
冷血范
3楼-- · 2019-01-28 08:10

what is the type of self.room, i think room is a list in this case you have to assign like this

if self.heading == 'East':
   self.sensors[0] = [self.x, self.y-1]

or like this

if self.heading == 'East':
    self.room = [self.x, self.y-1]
    self.sensors[0] = self.room

like this

>>> a = []
>>> type(a)
<type 'list'>

>>> a[2,3]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: list indices must be integers

>>> a = [2,3]
查看更多
闹够了就滚
4楼-- · 2019-01-28 08:12

self.room[self.x, self.y-1] indexes self.room with a tuple. If it is a ragged array then you must use self.room[self.x][self.y-1] instead.

查看更多
我只想做你的唯一
5楼-- · 2019-01-28 08:26

You say self.room is a "2d grid" -- I assume it is a list of lists. In this case, you should access its elements as

self.room[self.x][self.y-1]

instead of indexing the outer list with the pair self.x, self.y-1.

查看更多
家丑人穷心不美
6楼-- · 2019-01-28 08:28

Why does it give that error? I'm not passing any tuples!

Because __getitem__, which deals with [] resolution, converts self.room[1, 2] to 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)

and lists are not made to deal with such arguments.

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

查看更多
够拽才男人
7楼-- · 2019-01-28 08:30

This is because list indices must be integers, not anything else. In your case, you are trying to use tuples.

Your code is particularly odd, because there is no way you ever created self.room with tuple indices.

查看更多
登录 后发表回答