【问题标题】:How can I set a cell in python matrix?如何在 python 矩阵中设置单元格?
【发布时间】:2015-11-12 22:00:00
【问题描述】:

这是我的问题:

self.gameField = [
    ['-', '-', '-', '-', '-', '-', '-']
    ['-', '-', '-', '-', '-', '-', '-']
    ['-', '-', '-', '-', '-', '-', '-']
    ['-', '-', '-', '-', '-', '-', '-']
    ['-', '-', '-', '-', '-', '-', '-']
    ['-', '-', '-', '-', '-', '-', '-']
]

如您所见,我使用列表创建了一个矩阵,我需要更改用户选择的列的单个元素,所以我尝试了以下代码:

for z in self.gameField:
    if z[num] == "-":
        z[num] = "X"
        print "Done"

其中 'num' 是一个 0 到 6 的整数,表示子列表。我想选择一个列,并设置可用的最低 ' - '(如果有重力),例如,如果我选择 '0'

        ['-', '-', '-', '-', '-', '-', '-']
        ['-', '-', '-', '-', '-', '-', '-']
        ['-', '-', '-', '-', '-', '-', '-']
        ['-', '-', '-', '-', '-', '-', '-']
        ['-', '-', '-', '-', '-', '-', '-']
        ['X', '-', '-', '-', '-', '-', '-']

但实际上我的程序改变了所有列的值

        ['X', '-', '-', '-', '-', '-', '-']
        ['X', '-', '-', '-', '-', '-', '-']
        ['X', '-', '-', '-', '-', '-', '-']
        ['X', '-', '-', '-', '-', '-', '-']
        ['X', '-', '-', '-', '-', '-', '-']
        ['X', '-', '-', '-', '-', '-', '-']

我该如何解决?你有什么想法吗?

【问题讨论】:

  • 使用以下内容创建您的二维列表:stackoverflow.com/questions/13447882/…。这应该可以解决您的引用问题。
  • 你是如何初始化你的矩阵的?因为这可能是multiple list references 的经典示例
  • for z in self.gameField 将遍历每个“行”并将“单元格”设置为X,如果它在num 引用的列中为-
  • @RedShift,子列表没有改变,所以它不是引用问题
  • @Marco,您正在更改每个子列表的所有第一个元素,因此显然它们看起来都一样,self.gameField [0][0] 将获得第一行的第一个元素,self.gameField [5][0] 将获得第一个最后一行的元素

标签: python wxwidgets


【解决方案1】:

将以前的 cmets 放在一起:

假设您的网格创建良好(请参阅多个子列表引用的可能问题 - 基本上,如果您使用 self.gameField = [[['_']*7]*6] 之类的东西创建网格,似乎又短又干净,它实际上很糟糕在您的情况下),您只需在放置 "X" 后立即跳出 @9​​87654322@ 循环(否则您只需继续填充整个列!):

for z in self.gameField:
    if z[num] == "-":
        z[num] = "X"
        print "Done"
        break

请注意,您可能希望以相反的顺序迭代行(for 循环),以便在打印网格(或反向打印网格)时重力向下...

【讨论】:

    【解决方案2】:

    首先在lists 中定义lists,你仍然需要将lists, 分开。所以以下。

    [['-','-']['-', '-']]
    

    会变成。

    [['-','-'],['-', '-']]
    

    其次,您可以通过这种方式访问​​list 索引,而不是循环遍历lists

    gameField[3][3] = 'X'
    

    如果考虑算法因素,此访问的运行时间为 1,现在不相关。但扩大规模可能会成为一个问题。综上所述,我创建了以下运行代码。

    gameField = [['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-']]
    
    gameField[3][3] = 'X'
    
    print(gameField)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 2014-12-14
      • 1970-01-01
      • 2019-01-10
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多