首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在9x9网格中获取所有3x3网格的Python算法

在9x9网格中获取所有3x3网格的Python算法
EN

Stack Overflow用户
提问于 2021-06-19 13:51:03
回答 3查看 626关注 0票数 1

我有一个python函数来从一个9x9网格(想想sudoku)中找到3x3网格中的所有元素:

代码语言:javascript
运行
复制
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]只会添加数字,也就是说,不是我想要的。但这似乎是错误的做法。

我认为会有一个更好的方法来处理和优化它,但我不确定,这会是什么。

代码语言:javascript
运行
复制
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],
    ],
]

下面是检查函数正确工作的快速代码,因此您不需要编写自己的代码!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-06-19 16:31:47

代码语言:javascript
运行
复制
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]
    )

使用生成器意味着内存效率更高。

票数 0
EN

Stack Overflow用户

发布于 2021-06-19 15:34:54

这个怎么样:

代码语言:javascript
运行
复制
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的元组压成一个平面列表

最终结果如下:

代码语言:javascript
运行
复制
[[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并向其加载值:

代码语言:javascript
运行
复制
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

或者您可以使用传统的列表理解。

代码语言:javascript
运行
复制
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)
    ]
票数 2
EN

Stack Overflow用户

发布于 2022-03-28 18:15:38

如果您使用的是numpy,您可以使用整形和交换轴将9x9转换为包含3x3子矩阵的3x3矩阵。

代码语言:javascript
运行
复制
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框的一维数组:

代码语言:javascript
运行
复制
B = A.reshape(3,3,3,3).swapaxes(1,2).reshape(9,3,3)

或者您可以将其重塑为一个9x9,其中包含一行中每个框的元素:

代码语言:javascript
运行
复制
B = A.reshape(3,3,3,3).swapaxes(1,2).reshape(9,9)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68047401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档