3

我正在研究在 8 x 8 的 2d 网格房间周围移动机器人,其中一部分是初始化由机器人周围最近的 5 个瓷砖组成的传感器。

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

在这里,我正在创建一个由 5 个元素组成的空数组。

但是当我尝试像这样设置传感器的值时:

    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]

我得到“列表索引必须是整数,而不是元组”的错误。

4

6 回答 6

7

你说self.room的是一个“二维网格”——我假设它是一个列表列表。在这种情况下,您应该访问其元素

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

而不是用 pair 索引外部列表self.x, self.y-1

于 2012-02-20T20:18:35.387 回答
5

问题来自您的self.room.

因为这个:

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

是否相同:

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

那是你的tuple错误。

有两种可能:

  • self.room是一个二维数组,这意味着您可能的意思是:

    self.room[self.x][self.y-1]
    
  • 你想切片self.room

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

请提供有关self.room.

于 2012-02-20T20:19:59.227 回答
2

self.room[self.x, self.y-1]self.room带有元组的索引。如果它是一个参差不齐的数组,那么您必须使用它self.room[self.x][self.y-1]

于 2012-02-20T20:19:10.863 回答
0

self.room 的类型是什么,我认为 room 是一个列表,在这种情况下你必须像这样分配

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

或者像这样

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

像这样

>>> 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]
于 2012-02-20T20:31:52.240 回答
0

为什么它会给出这个错误?我没有传递任何元组!

因为__getitem__处理[]分辨率,转换self.room[1, 2]为元组:

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)

并且列表不是用来处理这些论点的。

更多示例:https ://stackoverflow.com/a/33086813/895245

于 2015-10-12T17:40:26.017 回答
-2

这是因为列表索引必须是整数,而不是其他任何东西。在您的情况下,您正在尝试使用元组。

您的代码特别奇怪,因为您从未self.room使用元组索引创建过任何方法。

于 2012-02-20T20:18:45.127 回答