我有一个python函数来从一个9x9网格(想想sudoku)中找到3x3网格中的所有元素:
def get_grids(grid):
out = []
for i in [0, 3, 6]:
for j in [0, 3, 6]:
g = ""
for m in range(i, i + 3):
for n in range(j, j + 3):
g += str(grid[m][n])
out.append([int(g_) for g_ in g])
return out
如果我设置了g = 0
,那么g += grid[m][n]
只会添加数字,也就是说,不是我想要的。但这似乎是错误的做法。
我认为会有一个更好的方法来处理和优化它,但我不确定,这会是什么。
assert get_grids(
[
[1, 3, 2, 5, 4, 6, 9, 8, 7],
[4, 6, 5, 8, 7, 9, 3, 2, 1],
[7, 9, 8, 2, 1, 3, 6, 5, 4],
[9, 2, 1, 4, 3, 5, 8, 7, 6],
[3, 5, 4, 7, 6, 8, 2, 1, 9],
[6, 8, 7, 1, 9, 2, 5, 4, 3],
[5, 7, 6, 9, 8, 1, 4, 3, 2],
[2, 4, 3, 6, 5, 7, 1, 9, 8],
[8, 1, 9, 3, 2, 4, 7, 6, 5],
]
) in [
[
[1, 3, 2, 4, 6, 5, 7, 9, 8],
[5, 4, 6, 8, 7, 9, 2, 1, 3],
[9, 8, 7, 3, 2, 1, 6, 5, 4],
[9, 2, 1, 3, 5, 4, 6, 8, 7],
[4, 3, 5, 7, 6, 8, 1, 9, 2],
[8, 7, 6, 2, 1, 9, 5, 4, 3],
[5, 7, 6, 2, 4, 3, 8, 1, 9],
[9, 8, 1, 6, 5, 7, 3, 2, 4],
[4, 3, 2, 1, 9, 8, 7, 6, 5],
],
[
[1, 4, 7, 3, 6, 9, 2, 5, 8],
[5, 8, 2, 4, 7, 1, 6, 9, 3],
[9, 3, 6, 8, 2, 5, 7, 1, 4],
[9, 3, 6, 2, 5, 8, 1, 4, 7],
[4, 7, 1, 3, 6, 9, 5, 8, 2],
[8, 2, 5, 7, 1, 4, 6, 9, 3],
[5, 2, 8, 7, 4, 1, 6, 3, 9],
[9, 6, 3, 8, 5, 2, 1, 7, 4],
[4, 1, 7, 3, 9, 6, 2, 8, 5],
],
]
下面是检查函数正确工作的快速代码,因此您不需要编写自己的代码!
发布于 2021-06-19 16:31:47
def get_grids(grid):
yield from (
(grid[m][n] for n in range(j, j + 3) for m in range(i, i + 3))
for j in [0, 3, 6]
for i in [0, 3, 6]
)
使用生成器意味着内存效率更高。
发布于 2021-06-19 15:34:54
这个怎么样:
from itertools import chain
def get_grids(grid):
x, y = len(grid), len(grid[0])
assert (x, y) == (9, 9)
size = 3
out = []
for i in range(0, x, size):
rows = [*zip(*grid[i: i + size])]
for j in range(0, y, size):
out.append([*chain(*zip(*rows[j: j + size]))])
return out
它使用zip函数同时获得三行,然后使用从每一行垂直切片(也就是3列)中获得的另一个zip。
链条用来将zip的元组压成一个平面列表
最终结果如下:
[[1, 3, 2, 4, 6, 5, 7, 9, 8],
[5, 4, 6, 8, 7, 9, 2, 1, 3],
[9, 8, 7, 3, 2, 1, 6, 5, 4],
[9, 2, 1, 3, 5, 4, 6, 8, 7],
[4, 3, 5, 7, 6, 8, 1, 9, 2],
[8, 7, 6, 2, 1, 9, 5, 4, 3],
[5, 7, 6, 2, 4, 3, 8, 1, 9],
[9, 8, 1, 6, 5, 7, 3, 2, 4],
[4, 3, 2, 1, 9, 8, 7, 6, 5]]
另一个选项是创建matrix9并向其加载值:
def get_grids(grid):
l = len(grid)
s = 3
out = [[None]*l for _ in range(l)]
for n in range(l):
for m in range(l):
k = (n // s) * s + m // s
j = (n % s) * s + m % s
out[k][j] = grid[n][m]
return out
或者您可以使用传统的列表理解。
def get_grids(grid):
l = len(grid)
s = 3
return [
[grid[(j // s) * s + i // s][(j % s) * s + i % s] for i in range(l)]
for j in range(l)
]
发布于 2022-03-28 18:15:38
如果您使用的是numpy,您可以使用整形和交换轴将9x9转换为包含3x3子矩阵的3x3矩阵。
A = np.array([
[0,0,0,3,0,1,6,0,2],
[0,2,0,0,0,0,7,1,0],
[0,0,8,0,7,0,0,0,0],
[2,4,0,5,3,8,1,9,0],
[9,8,0,0,0,0,0,0,0],
[7,5,0,1,2,0,4,6,8],
[0,0,2,8,0,7,0,4,0],
[0,1,0,0,0,0,0,0,6],
[0,3,4,9,1,0,0,0,0]
])
B = A.reshape(3,3,3,3).swapaxes(1,2)
或者,如果您想要一个包含所有9个3x3框的一维数组:
B = A.reshape(3,3,3,3).swapaxes(1,2).reshape(9,3,3)
或者您可以将其重塑为一个9x9,其中包含一行中每个框的元素:
B = A.reshape(3,3,3,3).swapaxes(1,2).reshape(9,9)
https://stackoverflow.com/questions/68047401
复制相似问题