Python – gibt es eine Möglichkeit, __getitem__ für Multidimension Array zu implementieren?

Ich möchte so etwas so verwenden:

class Board(): ... def __getitem__(self, y, x): return self.board[y][x] 

Aber unglücklich, wenn ich rufe:

 board[x][y] 

Ich bekomme: TypeError: __getitem__() takes exactly 3 arguments (2 given)

4 Solutions collect form web for “Python – gibt es eine Möglichkeit, __getitem__ für Multidimension Array zu implementieren?”

Wenn du board[x][y] machst, wirst du zwei Aufrufe zu __getitem__ weil du zwei getrennte Zugriffe machst: [x] ist eins und [y] ist ein anderer. Es gibt keine Möglichkeit, dies direkt in __getitem__ ; Du musst board[x] eine Art Unterobjekt zurückgeben, mit dem du [y] kannst, um das Einzelstück zu bekommen. Was Sie wahrscheinlich wollen, ist, __getitem__ ein Tupel zu akzeptieren:

 def __getitem__(self, tup): y, x = tup return self.board[y][x] 

Dann mach:

 board[x, y] 

(Beachten Sie, dass Sie die Reihenfolge von x und y zwischen __getitem__ und board[x][y] — ist das absichtlich?)

Mach einfach:

 class Board(): def __getitem__(self, x): return self.board[x] 

Denn wenn du b[x][y] __getitem__() ruft es eigentlich __getitem__() zweimal auf, wie unten gezeigt:

 import numpy as np b = Board() b.board = np.random.random((3,3,3)) print (b[2][0]==(b[2])[0]).all() #True 

Aber am besten wäre es, np.ndarray zu subklassen, damit du diese Methode nicht neu implementieren musst:

 class Board(np.ndarray): pass 

board[x][y] bedeutet board.__getitem__(x).__getitem__(y) , also Board.__getitem__ muss eine Art von Ansicht zurückgeben, die auch __getitem__ unterstützt und sich an x erinnert. Dies ist ein bisschen Arbeit, aber für einige Anwendungsfälle (alles, was die Weitergabe dieser Ansicht um) ist es sehr praktisch.

Eine weitere Option ist board[x, y] , was bedeutet, board.__getitem__((x, y)) . Beachten Sie, dass dies ein Tupel an __getitem__ , das man manuell auspacken muss (es gibt syntaktischen Zucker, um dies in 2.x zu tun, aber es ist ein bisschen unklar und auch in 3.x gegangen, also kannst du es vermeiden Im Interesse der zukünftigen Portierung).

Vielleicht möchten Sie diese Syntax verwenden:

 board[(x, y)] 

Es ist weniger schön, aber es erlaubt Ihnen, mehrdimensionale Arrays einfach zu haben. Eine beliebige Anzahl von Dimensionen in der Tat:

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

Durch das Vornehmen eines Defaultdict können Sie sogar spärliche Wörterbücher haben:

 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 

Wenn du etwas Fortgeschrittener willst, dann willst du wahrscheinlich NumPy .

  • Python-SMTP-Fehlercodebehandlung
  • Python zipfile dosen't Release Zip-Datei
  • Symbol nicht gefunden: _BIO_new_CMS
  • Greifenrahmen NTSCtoUSB dongle, opencv2, python wrapper
  • Python string codieren / decodieren
  • Pandas - GroupBy und dann Merge auf Originaltisch
  • Wie kann ich mehrere Schlüssel in WebDriver mit Python senden?
  • Python 2.7 - IPython 'raw_input' und Anhängen an eine Liste - fügt 'u' vor jedem Element hinzu
  • Wie kann man die Methode readall () von regex einschränken?
  • Python scrapy wie man den Parameter anstelle von cmd kodiert: benutzten Code in Scrapy verwenden
  • Schwierigkeiten mit der Verwendung von iloc in pandas dataframe mit hierarchischen Index
  • Python ist die beste Programmiersprache der Welt.