2016-08-08 6 views
2

Ich schreibe ein Python-Programm, um Tic Tac Toe zu spielen, mit Numpy-Arrays mit "X" durch 1 und "O" von 0 dargestellt. Die Klasse enthält eine Funktion, eine Markierung auf dem Brett zu platzieren:Wie entpacke ich eine Liste oder Tupel in Python

import numpy as np 

class Board(): 
    def __init__(self, grid = np.ones((3,3))*np.nan): 
     self.grid = grid 

    def place_mark(self, pos, mark): 
     self.grid[pos[0],pos[1]] = mark 

, so dass zum Beispiel

board = Board() 
board.place_mark([0,1], 1) 
print board.grid 

ergeben

[[ nan 1. nan] 
[ nan nan nan] 
[ nan nan nan]] 

Ich frage mich, ob das pos[0], pos[1] Argument in der place_mark Funktion könnte irgendwie durch den "entpackten" Inhalt von pos ersetzt werden (was immer eine Liste der Länge 2 ist). In Ruby würde dies mit dem splat-Operator geschehen: *pos, aber dies scheint keine gültige Syntax in Python zu sein.

+0

'board.place_mark ((0,1), 1)' und 'self.grid [pos] = mark' –

Antwort

3

Mit Numpy gibt es einen Unterschied zwischen Indexierung mit Listen und mehrdimensionaler Indizierung. self.grid[[0,1]] entspricht der Verkettung von self.grid[0] und self.grid[1] mit je 3x1 Arrays in einem 3x2-Array.

Wenn Sie Tupel anstelle von Listen für die Indizierung verwenden, wird es korrekt als multidimensionale Indizierung interpretiert: self.grid[(0, 1)] wird genauso interpretiert wie self.grid[0, 1].

Es gibt eine * Operatorsequenzen zum Auspacken, aber im Zusammenhang mit den Funktionsargumenten nur, zumindest in Python 2. Also, mit Listen können Sie auch dies tun:

def place_mark(self, mark, x, y): 
    self.grid[x, y] = mark 

place_mark(1, *[0, 1]) 

NB. (Expanded usefulness of * in Python 3)

2

Wie von Lukasz vorgeschlagen, sollte das Eingabeargument ein Tupel sein.

def place_mark(self, pos, mark): 
    self.grid[tuple(pos)] = mark 

Meine Frage ist nicht die gleiche What is the pythonic way to unpack tuples? weil pos nicht die Eingabeargumente an eine Funktion darstellen wird, sondern die Indizes eines 2-dimensionalen Array: In diesem Beispiel kann es zu einem umgewandelt werden.