我有一个9x9的数独板。我必须创建9个子方列表。我将每个列表作为一行存储在另一个名为sub_square的列表中。
CODE:
sub_square = []
sub_list = []
for x in range(0,3):
for y in range(0,3):
sub_list.append(sudoku[x][y])
sub_square.append(sub_list)
sub_list = []
for x in range (0,3):
for y in range(3,6):
sub_list.append(sudoku[x][y])
sub_square.append(sub_list)
sub_list = []
for x in range (0,3):
for y in range(6,9):
sub_list.append(sudoku[x][y])
sub_square.append(sub_list)
sub_list = []
我对其他6个子方块做同样的事情。有没有其他方法更简单。
SUDOKU:
[0, 9, 4, 3, 0, 0, 0, 0, 0],
[0, 0, 7, 5, 0, 0, 0, 0, 0],
[0, 0, 1, 4, 0, 0, 0, 2, 0],
[4, 6, 0, 8, 0, 0, 0, 0, 3],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[2, 0, 0, 0, 0, 3, 0, 6, 9],
[0, 5, 0, 0, 0, 6, 2, 0, 0],
[0, 0, 0, 0, 0, 5, 1, 0, 0],
[0, 0, 0, 0, 0, 1, 6, 4, 0]
所以第一个子方列表是:
[0, 9, 4, 0, 0, 7, 0, 0, 1]
答案 0 :(得分:3)
是的,有一种更简单的方法:
subsquares = [[sudokuSquare[j][i] for j in range(x, x + w) for i in range(y, y + h)] for x in range(0, 9, 3) for y in range(0, 9, 3)]
其中h
和w
分别是每个子方格的高度和宽度。 (为了您的目的,h
和w
都等于3。
答案 1 :(得分:2)
for y in range(0,3):
for y in range(3,6):
for y in range(6,9):
如果你看看你的三个代码块,除了上面引用的行之外,它们是相同的。这意味着您可以在另一个循环中用一个代码块替换它们,这个循环用作y循环范围的参数。然后,您需要第四个循环,您可以将其用作x循环范围的参数。然后你会得到Joel的答案,尽管他已经使用了迭代器,所以他可以把它全部折叠成一行代码。
答案 2 :(得分:1)
如果您不反对第三方库,请使用numpy:
import numpy as np
board = np.array([
[0, 9, 4, 3, 0, 0, 0, 0, 0],
[0, 0, 7, 5, 0, 0, 0, 0, 0],
[0, 0, 1, 4, 0, 0, 0, 2, 0],
[4, 6, 0, 8, 0, 0, 0, 0, 3],
[0, 0, 0, 0, 0, 0, 0, 0, 0],
[2, 0, 0, 0, 0, 3, 0, 6, 9],
[0, 5, 0, 0, 0, 6, 2, 0, 0],
[0, 0, 0, 0, 0, 5, 1, 0, 0],
[0, 0, 0, 0, 0, 1, 6, 4, 0]])
print(board)
print()
print(board[3,1]) # 4th row, 2nd column
print()
print(board[3]) # 4th row
print()
print(board[...,2]) # 3rd column
print(board[:,2:3]) # 3rd column (another way)
print()
print(board[0:3,0:3]) # first sub-square
print(board[0:3,0:3].flatten()) # another way
[[0 9 4 3 0 0 0 0 0]
[0 0 7 5 0 0 0 0 0]
[0 0 1 4 0 0 0 2 0]
[4 6 0 8 0 0 0 0 3]
[0 0 0 0 0 0 0 0 0]
[2 0 0 0 0 3 0 6 9]
[0 5 0 0 0 6 2 0 0]
[0 0 0 0 0 5 1 0 0]
[0 0 0 0 0 1 6 4 0]]
6
[4 6 0 8 0 0 0 0 3]
[4 7 1 0 0 0 0 0 0]
[[4]
[7]
[1]
[0]
[0]
[0]
[0]
[0]
[0]]
[[0 9 4]
[0 0 7]
[0 0 1]]
[0 9 4 0 0 7 0 0 1]
答案 3 :(得分:0)
改进Mark Tolonen的numpy
答案,您可以自动完成此过程。我假设你已经创建了numpy对象board
:
def subsquare(A,k,i,j):
return A[i*k:(i+1)*k, j*k:(j+1)*k].flatten().tolist()
def sub_itr(A,block_size):
assert A.shape[0]%block_size == 0 # Make sure block fits
k = A.shape[0]/block_size
for i in xrange(k):
for j in xrange(k):
yield subsquare(A,k,i,j)
for block in sub_itr(board,3):
print block
,并提供:
[0, 9, 4, 0, 0, 7, 0, 0, 1]
[3, 0, 0, 5, 0, 0, 4, 0, 0]
...
[2, 0, 0, 1, 0, 0, 6, 4, 0]