Python - 有没有办法为多维数组实现__getitem__?

IPr*_*ory 9 python arrays numpy multidimensional-array python-2.7

我想用这样的东西:

class Board():
    ...
    def __getitem__(self, y, x):
        return self.board[y][x]
Run Code Online (Sandbox Code Playgroud)

但不幸的是,当我打电话的时候:

board[x][y]
Run Code Online (Sandbox Code Playgroud)

我明白了: TypeError: __getitem__() takes exactly 3 arguments (2 given)

Bre*_*arn 14

当你这样做时,board[x][y]你将进行两次调用,__getitem__因为你正在进行两次单独的访问:[x]是一个而[y]另一个是.没有办法直接处理这个问题__getitem__; 您必须board[x]返回某种子对象,您可以使用[y]它来获取单个项目.你可能想要的是__getitem__接受一个元组:

def __getitem__(self, tup):
    y, x = tup
    return self.board[y][x]
Run Code Online (Sandbox Code Playgroud)

然后做:

board[x, y]
Run Code Online (Sandbox Code Playgroud)

(注意你有x和y的顺序切换__getitem__board[x][y]---是故意的吗?)


Len*_*bro 5

您可能需要考虑使用以下语法:

board[(x, y)]
Run Code Online (Sandbox Code Playgroud)

它不太漂亮,但它允许您简单地拥有多维数组。实际上是任意数量的维度:

board[(1,6,34,2,6)]
Run Code Online (Sandbox Code Playgroud)

通过将 board 设为 defaultdict,您甚至可以拥有稀疏字典:

board[(1,6,34,2,6)]

>>> from collections import defaultdict
>>> board = defaultdict(lambda: 0)
>>> board[(1,6,8)] = 7
>>> board[(1,6,8)]
7
>>> board[(5,6,3)]
0
Run Code Online (Sandbox Code Playgroud)

如果你想要更高级的东西,你可能想要NumPy