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块。因此,我对于如何执行此操作非常不知所措。谢谢。
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个块。这些由r和c变量控制。这也是为什么当我们访问板上的数字时将它们乘以3的原因(因为每个块都是3边的平方)。
接下来,我们要遍历每个块中的元素。翻译:查找每个3x3块中的数字。块中每个元素的索引由i和控制j。因此,我们拥有i和j来控制我们要访问的元素,以及r和c,它们是与木板本身的偏移量,确定了我们想要的“块”的位置。现在我们开始比赛了。
对于每个r和c(注意每个循环range(3),所以有9 (r,c)对-我们后面的9个块),循环遍历该块中的9个元素(9个(i,j)对)。现在,只需根据它们相对于(r,c)偏移量的相对位置来访问元素(3*r给出相关块的第一行,而add i获得所需元素的行。类似地,3*c给出相关块的第一列,而add j得到该列所需元素的坐标。因此,我们有了所需元素的坐标)。现在,我们将元素添加到block。
一旦我们遍历了块中的所有元素,就将块本身添加到答案中,然后保存!我们完成了
| 归档时间: |
|
| 查看次数: |
5068 次 |
| 最近记录: |