2016-08-08 85 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維數組的索引。