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

321*_*321 1 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],
       [0,8,0,7,3,0,0,0,0],
       [0,9,0,0,0,0,0,0,4]]
Run Code Online (Sandbox Code Playgroud)

我需要将它们变成包含3x3块的列表列表。因此,例如:

[[2,0,0,0,0,0,0,4,8],[etc]]
Run Code Online (Sandbox Code Playgroud)

我尝试创建一个名为“块”的列表,其中包含9个其他列表,每个列表中只有零。所以看起来像:

blocks=[[0,0,0,0,0,0,0,0,0],[etc]
Run Code Online (Sandbox Code Playgroud)

然后我使用了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
Run Code Online (Sandbox Code Playgroud)

但是,这给了我一个索引错误。如果我用“ BLOCK_COUNT”分别为3和6创建了两个while循环,那么我会得到更好的答案,但是对于某些情况,它仍然无法提供正确的3x3块。因此,我对于如何执行此操作非常不知所措。谢谢。

ins*_*get 5

def getBlocks(board):
    answer = []
    for r,c in itertools.product(range(3), repeat=2):
        answer.append([board[r+i][c+j] for i,j in itertools.product(range(0, 9, 3), repeat=2)])
    return answer
Run Code Online (Sandbox Code Playgroud)

当然,您可以只用一个列表理解来替换整个内容:

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)]
Run Code Online (Sandbox Code Playgroud)

如果您对不使用任何内置功能进行繁重工作的版本感兴趣:

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
Run Code Online (Sandbox Code Playgroud)

那么,这是怎么回事?

好吧,首先,我们决定迭代所需的9个块。这些由rc变量控制。这也是为什么当我们访问板上的数字时将它们乘以3的原因(因为每个块都是3边的平方)。

接下来,我们要遍历每个块中的元素。翻译:查找每个3x3块中的数字。块中每个元素的索引由i和控制j。因此,我们拥有ij来控制我们要访问的元素,以及rc,它们是与木板本身的偏移量,确定了我们想要的“块”的位置。现在我们开始比赛了。

对于每个rc(注意每个循环range(3),所以有9 (r,c)对-我们后面的9个块),循环遍历该块中的9个元素(9个(i,j)对)。现在,只需根据它们相对于(r,c)偏移量的相对位置来访问元素(3*r给出相关块的第一行,而add i获得所需元素的行。类似地,3*c给出相关块的第一列,而add j得到该列所需元素的坐标。因此,我们有了所需元素的坐标)。现在,我们将元素添加到block

一旦我们遍历了块中的所有元素,就将块本身添加到答案中,然后保存!我们完成了