Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中创建3x3数独块列表_Python_List_Sudoku - Fatal编程技术网

如何在python中创建3x3数独块列表

如何在python中创建3x3数独块列表,python,list,sudoku,Python,List,Sudoku,我需要帮助为数独中的9个3x3块创建一个列表。所以我有一个列表,代表了最初的数独板零意味着空: board=[[2,0,0,0,0,0,0,6,0], [0,0,0,0,7,5,0,3,0], [0,4,8,0,9,0,1,0,0], [0,0,0,3,0,0,0,0,0], [3,0,0,0,1,0,0,0,9], [0,0,0,0,0,8,0,0,0], [0,0,1,0,2,0,5,7,0],

我需要帮助为数独中的9个3x3块创建一个列表。所以我有一个列表,代表了最初的数独板零意味着空:

board=[[2,0,0,0,0,0,0,6,0],
       [0,0,0,0,7,5,0,3,0],
       [0,4,8,0,9,0,1,0,0],
       [0,0,0,3,0,0,0,0,0],
       [3,0,0,0,1,0,0,0,9],
       [0,0,0,0,0,8,0,0,0],
       [0,0,1,0,2,0,5,7,0],
       [0,8,0,7,3,0,0,0,0],
       [0,9,0,0,0,0,0,0,4]]
我需要将这些转换为包含3x3块的列表。例如:

[[2,0,0,0,0,0,0,4,8],[etc]]
我尝试创建一个名为blocks的列表,其中包含9个其他列表,每个列表中只有零。所以它看起来像:

blocks=[[0,0,0,0,0,0,0,0,0],[etc]
然后我使用while循环来更改列表中的值:

BLOCK_COUNT=0
BOARD_COUNT=0
while BLOCK_COUNT<len(blocks):
    blocks[BLOCK_COUNT][0]=board[BOARD_COUNT][BOARD_COUNT]
    blocks[BLOCK_COUNT][1]=board[BOARD_COUNT][BOARD_COUNT+1]
    blocks[BLOCK_COUNT][2]=board[BOARD_COUNT][BOARD_COUNT+2]
    blocks[BLOCK_COUNT][3]=board[BOARD_COUNT+1][BOARD_COUNT]
    blocks[BLOCK_COUNT][4]=board[BOARD_COUNT+1][BOARD_COUNT+1]
    blocks[BLOCK_COUNT][5]=board[BOARD_COUNT+1][BOARD_COUNT+2]
    blocks[BLOCK_COUNT][6]=board[BOARD_COUNT+2][BOARD_COUNT]
    blocks[BLOCK_COUNT][7]=board[BOARD_COUNT+2][BOARD_COUNT+1]
    blocks[BLOCK_COUNT][8]=board[BOARD_COUNT+2][BOARD_COUNT+2]
    BLOCK_COUNT+=1
    BOARD_COUNT+=3

然而,这给了我一个索引错误。如果我创建了其中两个while循环,其中BLOCK_COUNT分别为3和6,那么我会得到一个更好的答案,但对于某些情况,它仍然不能给我正确的3x3块。所以我对如何做到这一点感到非常困惑。谢谢。

当您使用numpy时,您可以结合使用重塑和转置来实现这一点

编辑-抱歉-过早按enter键:

import numpy as np
board=[[2,0,0,0,0,0,0,6,0],
       [0,0,0,0,7,5,0,3,0],
       [0,4,8,0,9,0,1,0,0],
       [0,0,0,3,0,0,0,0,0],
       [3,0,0,0,1,0,0,0,9],
       [0,0,0,0,0,8,0,0,0],
       [0,0,1,0,2,0,5,7,0],
       [0,8,0,7,3,0,0,0,0],
       [0,9,0,0,0,0,0,0,4]]

t = np.array(board).reshape((3,3,3,3)).transpose((0,2,1,3)).reshape((9,9));
print t
输出:

[[2 0 0 0 0 0 0 4 8]
 [0 0 0 0 7 5 0 9 0]
 [0 6 0 0 3 0 1 0 0]
 [0 0 0 3 0 0 0 0 0]
 [3 0 0 0 1 0 0 0 8]
 [0 0 0 0 0 9 0 0 0]
 [0 0 1 0 8 0 0 9 0]
 [0 2 0 7 3 0 0 0 0]
 [5 7 0 0 0 0 0 0 4]]

在使用numpy时,可以结合使用重塑和转置来实现这一点

编辑-抱歉-过早按enter键:

import numpy as np
board=[[2,0,0,0,0,0,0,6,0],
       [0,0,0,0,7,5,0,3,0],
       [0,4,8,0,9,0,1,0,0],
       [0,0,0,3,0,0,0,0,0],
       [3,0,0,0,1,0,0,0,9],
       [0,0,0,0,0,8,0,0,0],
       [0,0,1,0,2,0,5,7,0],
       [0,8,0,7,3,0,0,0,0],
       [0,9,0,0,0,0,0,0,4]]

t = np.array(board).reshape((3,3,3,3)).transpose((0,2,1,3)).reshape((9,9));
print t
输出:

[[2 0 0 0 0 0 0 4 8]
 [0 0 0 0 7 5 0 9 0]
 [0 6 0 0 3 0 1 0 0]
 [0 0 0 3 0 0 0 0 0]
 [3 0 0 0 1 0 0 0 8]
 [0 0 0 0 0 9 0 0 0]
 [0 0 1 0 8 0 0 9 0]
 [0 2 0 7 3 0 0 0 0]
 [5 7 0 0 0 0 0 0 4]]
当然,您可以用一个列表来代替整个内容:

answer = [[board[r+i][c+j] for i,j in itertools.product(range(0, 9, 3), repeat=2)]
          for r,c in itertools.product(range(3), repeat=2)]
如果您感兴趣的是一个不使用任何内置来完成任何繁重工作的版本:

def getBlocks(board):
    answer = []
    for r in range(3):
        for c in range(3):
            block = []
            for i in range(3):
                for j in range(3):
                    block.append(board[3*r + i][3*c + j])
            answer.append(block)
    return answer
这里发生了什么事

首先,我们决定迭代我们想要的9个块。这些由r和c变量控制。这也是为什么我们在访问电路板上的数字时将它们乘以3,因为每个块都是3边的平方

接下来,我们要迭代每个块中的元素。翻译:查找每个3x3块中的数字。块内每个元素的索引由i和j控制。所以我们有i和j,它们控制我们想要访问的元素,还有r和c,它们是它们从电路板本身的偏移量,决定了我们想要的块的位置。现在我们要去比赛了

对于每个r和c,注意每个循环都在范围3上,因此有9个r,c对-我们所关注的9个块,循环在块中的9个元素上,9个i,j对。现在,只需根据元素相对于r的相对位置访问它们,c偏移量3*r给出相关块的第一行,加上i给出所需元素的行。类似地,3*c给出了相关块的第一列,加上j给出了所需元素的列。因此,我们有我们想要的元素的坐标。现在,我们将元素添加到块中

一旦我们循环了块中的所有元素,我们将块本身添加到答案中,然后开始!我们结束了

当然,您可以用一个列表来代替整个内容:

answer = [[board[r+i][c+j] for i,j in itertools.product(range(0, 9, 3), repeat=2)]
          for r,c in itertools.product(range(3), repeat=2)]
如果您感兴趣的是一个不使用任何内置来完成任何繁重工作的版本:

def getBlocks(board):
    answer = []
    for r in range(3):
        for c in range(3):
            block = []
            for i in range(3):
                for j in range(3):
                    block.append(board[3*r + i][3*c + j])
            answer.append(block)
    return answer
这里发生了什么事

首先,我们决定迭代我们想要的9个块。这些由r和c变量控制。这也是为什么我们在访问电路板上的数字时将它们乘以3,因为每个块都是3边的平方

接下来,我们要迭代每个块中的元素。翻译:查找每个3x3块中的数字。块内每个元素的索引由i和j控制。所以我们有i和j,它们控制我们想要访问的元素,还有r和c,它们是它们从电路板本身的偏移量,决定了我们想要的块的位置。现在我们要去比赛了

对于每个r和c,注意每个循环都在范围3上,因此有9个r,c对-我们所关注的9个块,循环在块中的9个元素上,9个i,j对。现在,只需根据元素相对于r的相对位置访问它们,c偏移量3*r给出相关块的第一行,加上i给出所需元素的行。类似地,3*c给出了相关块的第一列,加上j给出了所需元素的列。因此,我们有我们想要的元素的坐标。现在,我们将元素添加到块中

一旦我们循环了块中的所有元素,我们将块本身添加到答案中,然后开始!我们完成了

应该可以工作,在python3中,您可以用intm/3*3替换m/3*3 应该可以,在python3中,您可以用intm/3*3替换m/3*3 这不使用内置项,对于3个嵌套循环更快

这不使用内置项,对于3个嵌套循环更快


如果您希望我们调试您的错误,请向我们提供完整的错误和回溯,而不仅仅是错误的描述。不,正如我所说,我需要帮助创建3x3块的列表。我只是给出了关于错误的信息,认为知道我哪里出错可能有用。我假设它是不需要的?因为你没有给我们足够的信息来调试你的代码,所以每个人都忽略了这一部分,而是为你写了全新的代码。全新的代码可能会更好,至少如果你能理解它,但是如果你想让我们调试你的er,那么知道你哪里出错了不是很有帮助吗
ror,请给我们完整的错误和回溯,而不仅仅是错误的描述。不,正如我所说,我需要帮助创建3x3块的列表。我只是给出了关于错误的信息,认为知道我哪里出错可能有用。我假设它是不需要的?因为你没有给我们足够的信息来调试你的代码,所以每个人都忽略了这一部分,而是为你写了全新的代码。全新的代码可能会更好,至少如果你能理解它,但是如果你知道你哪里出了错,这不是很有帮助吗?如果有一个解释,这会更好。另外,对于新手来说,使用嵌套循环可能比使用产品更简单。还是比我将要发布的内容要好,在那里我使用了三行理解而不是理解…确认,现在你添加了我的理解,但将其塞进了两行而不是三行:但幸运的是,你首先展示了更为新手友好的版本。对不起@abarnert,我只是太喜欢列表中的comps了。最后一件事:关于0、9、3范围内的r,你可以去掉3*和它的解释吗?向新手解释更容易,还是更难?@abarnert:我考虑过,但我认为这类似于使用itertools.product,因为它对你有很大的帮助。乘法运算让OP准确地看到发生了什么。也许,我应该在一个列表理解中使用range0,9,3,以表明这将使工作更容易。如果有一个解释,这会更好。另外,对于新手来说,使用嵌套循环可能比使用产品更简单。还是比我将要发布的内容要好,在那里我使用了三行理解而不是理解…确认,现在你添加了我的理解,但将其塞进了两行而不是三行:但幸运的是,你首先展示了更为新手友好的版本。对不起@abarnert,我只是太喜欢列表中的comps了。最后一件事:关于0、9、3范围内的r,你可以去掉3*和它的解释吗?向新手解释更容易,还是更难?@abarnert:我考虑过,但我认为这类似于使用itertools.product,因为它对你有很大的帮助。乘法运算让OP准确地看到发生了什么。也许,我应该在一个列表理解中使用range0,9,3,以表明这将使工作更容易。这将提高列表索引必须是整数,而不是python 3.4中的浮点异常,因为除法m/2产生浮点,而不是和int。因此,它应该是m//3以产生除法的下限。这会导致列表索引必须是整数,而不是python 3.4中的浮点异常,因为除法m/2产生浮点而不是和int。因此,它应该是m//3以产生除法的下限。请不要发布重复的答案。编辑一个答案以包含任何差异。请看。请不要发布重复的答案。编辑一个答案以包含任何差异。看见