【问题标题】:How to 'unpack' a list or tuple in Python如何在 Python 中“解包”列表或元组
【发布时间】:2016-08-08 14:45:00
【问题描述】:

我正在编写一个 Python 程序来玩井字游戏,使用 Numpy 数组,其中“X”由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]]

我想知道place_mark 函数中的pos[0], pos[1] 参数是否可以以某种方式被pos 的“未打包”内容替换(它始终是长度为2 的列表)。在 Ruby 中,这将使用 splat 运算符来完成:*pos,但这似乎不是 Python 中的有效语法。

【问题讨论】:

  • board.place_mark((0,1), 1)self.grid[pos] = mark

标签: python numpy


【解决方案1】:

使用 Numpy,列表索引和多维索引之间存在差异。 self.grid[[0,1]] 等价于将 self.grid[0]self.grid[1],每个 3x1 数组连接成一个 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])

注意。 (Expanded usefulness of * in Python 3)

【讨论】:

    【解决方案2】:

    按照 Lukasz 的建议,输入参数应该是一个元组。在此示例中,它可以转换为 1:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 2021-10-06
      • 2012-04-16
      • 2017-09-06
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      相关资源
      最近更新 更多