关于数组:Python的列表索引必须是整数,而不是元组“错误

Python 'list indices must be integers, not tuple" error

我正致力于在8x 8的二维网格房间内移动机器人,其中一部分正在初始化传感器,传感器由机器人周围最近的5块瓷砖组成。

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

这里我创建了一个空的5个元素数组。

但当我试图设置这样的传感器值时:

1
2
3
4
5
6
    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]

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


你说self.room是一个"二维网格"——我假设它是一个列表。在这种情况下,您应该将其元素作为

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

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


问题来自你的self.room

因为这样:

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

与以下内容相同:

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

这就是你的tuple错误。

有两种可能性:

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

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

    1
    self.room[self.x:self.y-1]
  • 小精灵

    请提供有关self.room的更多信息。


    self.room[self.x, self.y-1]用元组索引self.room。如果是不规则数组,则必须使用self.room[self.x][self.y-1]


    为什么会出错?我不会传递任何元组!

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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


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

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

    或者像这样

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

    这样地

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> 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]

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

    您的代码特别奇怪,因为您无法用元组索引创建self.room