【问题标题】:Filling blank indices of multi-dimensional list then checking if full填充多维列表的空白索引然后检查是否已满
【发布时间】:2019-11-26 03:31:43
【问题描述】:

我有一个现有的多维列表,其中包含预定(最终)值self.origBoard 和另一个相同大小的多维列表self.board,它允许用户填写值。 self.origBoard 以几个空格(空白)和其他整数值开头,而 self.board 以完全空白(空)开头。

向用户显示self.origBoardself.board 的组合,目的是让用户为self.origBoard 中以空白开头的所有索引提供一个整数值。我有一些单独的代码可以在用户填写所有空白时运行,但是我无法在代码中确定这个完整事件何时发生。

例如,self.origBoard 定义为:

self.origBoard[0]=' 19374652'
self.origBoard[1]='576182943'
self.origBoard[2]='342596718'
self.origBoard[3]='921753864'
self.origBoard[4]='638419527'
self.origBoard[5]='457628139'
self.origBoard[6]='185237496'
self.origBoard[7]='763941285'
self.origBoard[8]='29486537 '

这个self.origBoard 按预期生成,但我在处理self.board 的生成和全面检查时遇到了麻烦。这是我初始化self.board的代码

self.board = [None] * 9      # Used to mark user-entered numbers
        for i in range(9):
            self.board[i] = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ]

我目前使用这种内部方法检查是否已满:

def fullBoard(self):
        for i in range(0,9):
            for k in range(0,9):
                if self.board[i][k] == ' ':

                    return False
        return True

我使用这种要求用户输入的方法填写这些空白('')。

def nextMove(self):
        row = int(input('Enter Row:'))
        col = int(input("Enter Column:"))
        num = input("Enter Number:")
        self.board[row][col] = num

由于只会提示用户填写self.origBoard 中的空白,(即本例中的两个索引),我不确定如何检查整个组合板是否已满。

现在我知道为什么fullBoard() 永远不会返回true,那是因为self.board 中的剩余索引将保持' '。如何检查self.boardself.origBoard 的组合值是否代表全板?

下面的最小工作代码示例:

class Sudoku():

    def __init__(self):

        self.board = [None] * 9      # Used to mark user-entered numbers
            for i in range(9):
                self.board[i] = [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ]

        self.origBoard[0]=' 19374652'
        self.origBoard[1]='576182943'
        self.origBoard[2]='342596718'
        self.origBoard[3]='921753864'
        self.origBoard[4]='638419527'
        self.origBoard[5]='457628139'
        self.origBoard[6]='185237496'
        self.origBoard[7]='763941285'
        self.origBoard[8]='29486537 '

        self.board = self.origBoard

    def display(self):
        # display stuff
        pass

    def nextMove(self):
        row = int(input('Enter Row:'))
        col = int(input("Enter Column:"))
        num = input("Enter Number:")
        self.board[row][col] = num

    def fullBoard(self):
        for i in range(0,9):
            for k in range(0,9):
                if self.board[i][k] == ' ':

                    return False
        return True

    def winCheck(self):
        # Do some checks
        print("Testing ftw!")

if __name__ == '__main__':
    game = Sudoku()
    game.display()
    while(True):
        game.nextMove()
        if game.fullBoard() == True:
            break
            if game.winCheck() == True:
                game.display()
                print("You win!")
                break
            elif game.winCheck() == False:
                game.display()
                print("One or more of your numbers are overlapping!")
                continue
        else:
            game.display()


【问题讨论】:

  • 如何定义“完整”?每行 9 个整数值?像你的第一行和最后一行这样的空间呢? self.origBoard[0]=' 19374652'你想让这个 origBoard 被视为已满吗?
  • 那是一个测试板,当我检查每回合后的板时(我自己填写空格)。对于一个完整的板,每个索引都应该有一个数字(字符串),并且不能有空格。
  • 那么对于测试板,您当前对 fullBoard() 的评估返回 True 还是 False?
  • 如果板子已满,则返回 True,否则返回 false。它总是错误的,因为我不知道如何将“origBoard”合并到其中。
  • self.boardself.origBoard 应该不同吗?即为什么你不只是将这些测试值存储在self.board 中?您出于某种原因需要保持原始值?我问,因为在fullBoard() 中,您正在检查self.board,而您将值存储在self.origBoard 中。换句话说,fullBoard() 应该返回 True 如果你用像 self.board[0]='019374652' 这样的行而不是 self.origBoard[0]='019374652' 来初始化你的板

标签: python list multidimensional-array


【解决方案1】:

根据 cmets 中的讨论,问题似乎在于 self.board 的值的生成和分配以及列表的设置方式(使用字符串作为行而不是另一个列表)。我猜用户很困惑,因为他们可以遍历字符串,类似于遍历数组或列表的方式,但无法为特定字符分配值,即他们之前的 self.board[row][col] = num 正在抛出一个错误:

TypeError: 'str' 对象不支持项目分配

尽管self.board[row][col] 会很高兴地从字符串中返回一个字符。

从给出的代码来看,用户似乎需要在为self.board 分配新值之前复制self.origBoard。如果没有这样的步骤,self.board 永远不会被填充除“ ”的初始值之外的值,以及使用 nextMove() 方法分配的值。因此,fullBoard() 总是返回 False 是有道理的,因为 ' ' 值将始终保留在 self.board 中。示例工作代码如下:

class Sudoku():

    def __init__(self):
        # Note the one liner to replace your initializer for this
        self.origBoard = [[' '] * 9] * 9

        # Note the change from single strings to a list of integers
        self.origBoard[0]=[' ',1,9,3,7,4,6,5,2]
        self.origBoard[1]=[5,7,6,1,8,2,9,4,3]
        self.origBoard[2]=[3,4,2,5,9,6,7,1,8]
        self.origBoard[3]=[9,2,1,7,5,3,8,6,4]
        self.origBoard[4]=[6,3,8,4,1,9,5,2,7]
        self.origBoard[5]=[4,5,7,6,2,8,1,3,9]
        self.origBoard[6]=[1,8,5,2,3,7,4,9,6]
        self.origBoard[7]=[7,6,3,9,4,1,2,8,5]
        self.origBoard[8]=[2,9,4,8,6,5,3,7,' ']

        self.board = self.origBoard

    def display(self):
        # display stuff
        pass

    def nextMove(self):
        row = int(input('Enter Row:'))
        col = int(input("Enter Column:"))
        num = input("Enter Number:")
        self.board[row][col] = num

    def fullBoard(self):
        for i in range(0,9):
            for k in range(0,9):
                if self.board[i][k] == ' ':

                    return False
        return True

    def winCheck(self):
        # Do some checks
        print("testing ftw!")

if __name__ == '__main__':
    game = Sudoku()
    game.display()
    while(True):
        game.nextMove()
        if game.fullBoard() == True:
            # a break statement here would mean the following if statements are never reached
            if game.winCheck() == True:
                game.display()
                print("You win!")
                break
            elif game.winCheck() == False:
                game.display()
                print("One or more of your numbers are overlapping!")
                continue
        else:
            game.display()



在这里我定义了“工作”,因为我为索引 0,0 和 8,8 输入了 num 值,这会导致调用 game.winCheck()

作为旁注,我尝试尽可能多地使用现有代码,因为这似乎是一些学习列表和 python 工作原理的任务,而不是需要优化的东西,但我选择了初始化每个板更容易,并避免不必要的循环:

self.board = [[' '] * 9] * 9

或者更好的是,您可以使用 Numpy 数组,并使用 all 方法来检查是否已满,而不是编写自己的方法来执行此操作。即

import numpy as np

self.board = np.zeros([9,9])

def fullBoard(self):
    np.all(self.board)

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 2016-01-31
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多