格式化数独网格 Python 3

m4g*_*4ge -1 arrays formatting list sudoku python-3.x

所以基本上,我试图通过将回溯作为一个学习项目来使用 Python 3 创建一个数独求解器,所以我还没有达到完美的效率(我将在之后重写它以试图让它变得更好,我使用了多余的变量和其他随机的东西),只是让它工作。然而,当我在处理它时,调试变得越来越困难,我想随着它的进行更好地格式化我正在使用的网格,但是我真的不知道该怎么做。这就是我现在存储它的方式:

grid = [
[4, 0, 0, 0, 0, 5, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 9, 8],
[3, 0, 0, 0, 8, 2, 4, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 8, 0],
[9, 0, 3, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 3, 0, 6, 7, 0],
[0, 5, 0, 0, 0, 9, 0, 0, 0],
[0, 0, 0, 2, 0, 0, 9, 0, 7],
[6, 4, 0, 3, 0, 0, 0, 0, 0],
]
Run Code Online (Sandbox Code Playgroud)

但我想以这种格式输出它:

-------------------------------------
| 4         |         5 |           |
|   +   +   +   +   +   +   +   +   |
|           |           | 1   9   8 |
|   +   +   +   +   +   +   +   +   |
| 3         |     8   2 | 4         |
|---+---+---+---+---+---+---+---+---|
|           | 1         |     8     |
|   +   +   +   +   +   +   +   +   |
| 9       3 |           |           |
|   +   +   +   +   +   +   +   +   |
|           |     3     | 6   7     |
|---+---+---+---+---+---+---+---+---|
|     5     |         9 |           |
|   +   +   +   +   +   +   +   +   |
|           | 2         | 9       7 |
|   +   +   +   +   +   +   +   +   |
| 6   4     | 3         |           |
-------------------------------------
Run Code Online (Sandbox Code Playgroud)

(包括将 0 改成空格)

现在我只是使用 pprint.pprint 将其打印出来,但它变得越来越具有挑战性。作为一个完整的编程菜鸟,我如何有效地格式化网格?

编辑:我能知道为什么我被否决了吗?几分钟前我注册了我的帐户来问这个问题,但我想我已经提供了足够的信息,我在 Stack Overflow 上找不到这个问题。

Blc*_*ght 8

这是我准备您想要的输出的方法:

def print_sudoku(board):
    print("-"*37)
    for i, row in enumerate(board):
        print(("|" + " {}   {}   {} |"*3).format(*[x if x != 0 else " " for x in row]))
        if i == 8:
            print("-"*37)
        elif i % 3 == 2:
            print("|" + "---+"*8 + "---|")
        else:
            print("|" + "   +"*8 + "   |")
Run Code Online (Sandbox Code Playgroud)

有三个关键部分。

第一个是用于enumerate迭代板的行并获得每行的索引。我们需要索引来告诉行后面的行应该如何格式化。

下一个关键位是摆脱零。我使用列表推导式[x if x != 0 else " " for x in row]将每个推导式替换0为一个空格字符串。我现在想到x or " "这是一种更简洁(但可能不太可读)的做法x if x != 0 else " "

最后一个棘手的问题是字符串格式。而不是写出字符串:

 "| {}   {}   {} | {}   {}   {} | {}   {}   {} |"
Run Code Online (Sandbox Code Playgroud)

完整地说,我使用字符串连接和重复来更简洁地创建它:

 ("|" + " {}   {}   {} |"*3)
Run Code Online (Sandbox Code Playgroud)

这用作 的格式字符串str.format,它从列表推导式中插入一个值来代替每个值{}

如果愿意在外边框中有加号,您可以稍微简化一下:

+---+---+---+---+---+---+---+---+---+
| 4         |         5 |           |
+   +   +   +   +   +   +   +   +   +
|           |           | 1   9   8 |
+   +   +   +   +   +   +   +   +   +
| 3         |     8   2 | 4         |
+---+---+---+---+---+---+---+---+---+
|           | 1         |     8     |
+   +   +   +   +   +   +   +   +   +
| 9       3 |           |           |
+   +   +   +   +   +   +   +   +   +
|           |     3     | 6   7     |
+---+---+---+---+---+---+---+---+---+
|     5     |         9 |           |
+   +   +   +   +   +   +   +   +   +
|           | 2         | 9       7 |
+   +   +   +   +   +   +   +   +   +
| 6   4     | 3         |           |
+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

是由:

def print_sudoku2(board):
    print("+" + "---+"*9)
    for i, row in enumerate(board):
        print(("|" + " {}   {}   {} |"*3).format(*[x if x != 0 else " " for x in row]))
        if i % 3 == 2:
            print("+" + "---+"*9)
        else:
            print("+" + "   +"*9)
Run Code Online (Sandbox Code Playgroud)