2016-08-08 9 views
2

1で表される「N」と0で表されるNumpy配列を使用して、Tic Tac Toeを実行するPythonプログラムを作成しています。クラスは、ボード上のマークを配置する機能が含まれていますリストまたはタプルをPythonで解凍する方法

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

は私が思っていた

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

得、例えば、そのため

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 

場合でpos[0], pos[1]引数place_mark機能は、何らかの形で、「開梱された」内容のpos(常に長さ2のリスト)に置き換えることができます。 Rubyではsplat演算子:*posを使用してこれを行いますが、これはPythonでは有効な構文ではありません。

+0

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

答えて

3

Numpyでは、リストのインデックス作成と多次元インデックス作成に違いがあります。 self.grid[[0,1]]は、それぞれ3x1配列のself.grid[0]self.grid[1]を3x2配列に連結することと同等です。

インデックスのリストの代わりにタプルを使用すると、多次元インデックスとして正しく解釈されます。self.grid[(0, 1)]は、self.grid[0, 1]と同じと解釈されます。

、配列を開梱ため*演算子がありますが、関数の引数のコンテキストでのみ、少なくともPythonの2にので、リストをあなたもこれを行うことができます:

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

Lukaszの示唆したように、入力引数はタプルでなければなりません。 pos関数への入力引数を構成しないので

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

私の質問が同じWhat is the pythonic way to unpack tuples?ではなく、2次元配列のインデックス:この例では1に変換することができます。

関連する問題