如何在Python中“解包”列表或元组

时间:2016-08-08 14:45:00

标签: python numpy

我正在编写一个Python程序来玩Tic Tac Toe,使用Numpy数组,其中“{”代表1,“O”代表0。该课程包括在棋盘上放置标记的功能:

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中的有效语法。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

正如Lukasz所建议的那样,输入参数应该是一个元组。在此示例中,它可以转换为:

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

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