2016-08-08 48 views
2

我正在编写一个Python程序来播放Tic Tac Toe,使用带有1代表的“X”和0代表的“O”的Numpy阵列。这个类包含的功能放置在基板上的标记:如何在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 

,使得,例如,

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

产生

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

我想知道如果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所建议的那样,输入参数应该是一个元组。在这个例子中它可被转化为一个:

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

我的问题是不一样的,因为What is the pythonic way to unpack tuples?pos并不构成所述输入参数的函数,而是2维数组的索引。