我想用這樣的事情:Python - 有沒有辦法實現__getitem__多維數組?
class Board():
...
def __getitem__(self, y, x):
return self.board[y][x]
,但可惜的是,當我打電話:
board[x][y]
我得到: TypeError: __getitem__() takes exactly 3 arguments (2 given)
我想用這樣的事情:Python - 有沒有辦法實現__getitem__多維數組?
class Board():
...
def __getitem__(self, y, x):
return self.board[y][x]
,但可惜的是,當我打電話:
board[x][y]
我得到: TypeError: __getitem__() takes exactly 3 arguments (2 given)
當你做board[x][y]
會給你帶來致電__getitem__
,因爲您正在進行兩次單獨訪問:[x]
是一個,[y]
是另一個。沒有辦法直接在__getitem__
中處理這個;你必須有board[x]
返回某種子對象,你可以使用[y]
來獲得單個項目。你可能想的是讓__getitem__
接受一個元組:
def __getitem__(self, tup):
y, x = tup
return self.board[y][x]
然後做:
board[x, y]
(請注意,您有x和y的__getitem__
和board[x][y]
之間切換的順序 - 是故意的嗎?)
board[x][y]
意味着board.__getitem__(x).__getitem__(y)
,所以Board.__getitem__
必須返回某種觀點,也支持__getitem__
並記住x
。這是一些工作,但對於一些使用情況(任何涉及傳遞視圖的任何情況)都非常方便。
另一種選擇是board[x, y]
,這意味着board.__getitem__((x, y))
。請注意,這將一個元組傳遞給__getitem__
,您必須手動解包(在2.x中有這樣的語法糖,但它有點模糊,並且在3.x中也不見了,所以您可能需要避免它爲了將來的移植工作)。
只要做到:
class Board():
def __getitem__(self, x):
return self.board[x]
,因爲當你調用b[x][y]
它實際上調用__getitem__()
兩次,如下顯示:
import numpy as np
b = Board()
b.board = np.random.random((3,3,3))
print (b[2][0]==(b[2])[0]).all()
#True
但是,最好將繼承np.ndarray
,讓你不不得不重新實施這種方法:
class Board(np.ndarray):
pass
您可能要考慮使用這種語法:
board[(x, y)]
它不太漂亮,但它可以讓你有多維數組簡單。任何數量其實維度:如果你想要的東西比你可能要NumPy更先進
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
:
board[(1,6,34,2,6)]
通過使板defaultdict你甚至可以有稀疏的字典。