格式化数独网格 Python 3
Formating Sudoku Grids Python 3
所以基本上,我正在尝试使用 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],
]
但我想以这种格式输出:
-------------------------------------
| 4 | 5 | |
| + + + + + + + + |
| | | 1 9 8 |
| + + + + + + + + |
| 3 | 8 2 | 4 |
|---+---+---+---+---+---+---+---+---|
| | 1 | 8 |
| + + + + + + + + |
| 9 3 | | |
| + + + + + + + + |
| | 3 | 6 7 |
|---+---+---+---+---+---+---+---+---|
| 5 | 9 | |
| + + + + + + + + |
| | 2 | 9 7 |
| + + + + + + + + |
| 6 4 | 3 | |
-------------------------------------
(包括把0改成空格)
现在我只是使用 pprint.pprint 打印出来,但它越来越具有挑战性。作为一个完全的编程菜鸟,我该如何高效地格式化网格?
编辑:
我能知道为什么我被否决了吗?我几分钟前注册了我的帐户来问这个问题,但我认为我提供了足够的信息,我在 Stack Overflow 上找不到这个问题。
以下是我准备您想要的输出的方式:
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 + " |")
三个关键部分。
第一种是使用 enumerate
遍历棋盘的行并获取每一行的索引。我们需要索引来告诉行后的行应该如何格式化。
下一个关键位是去掉零。我使用列表理解 [x if x != 0 else " " for x in row]
将每个 0
替换为一个 space 字符串。我现在想到 x or " "
会是一种更简洁(但可能不太可读)的 x if x != 0 else " "
.
方式
最后一个棘手的问题是字符串格式。而不是写出字符串:
"| {} {} {} | {} {} {} | {} {} {} |"
完整的,我使用字符串连接和重复来更简洁地创建它:
("|" + " {} {} {} |"*3)
这用作 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 | |
+---+---+---+---+---+---+---+---+---+
制作人:
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)
所以基本上,我正在尝试使用 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],
]
但我想以这种格式输出:
-------------------------------------
| 4 | 5 | |
| + + + + + + + + |
| | | 1 9 8 |
| + + + + + + + + |
| 3 | 8 2 | 4 |
|---+---+---+---+---+---+---+---+---|
| | 1 | 8 |
| + + + + + + + + |
| 9 3 | | |
| + + + + + + + + |
| | 3 | 6 7 |
|---+---+---+---+---+---+---+---+---|
| 5 | 9 | |
| + + + + + + + + |
| | 2 | 9 7 |
| + + + + + + + + |
| 6 4 | 3 | |
-------------------------------------
(包括把0改成空格)
现在我只是使用 pprint.pprint 打印出来,但它越来越具有挑战性。作为一个完全的编程菜鸟,我该如何高效地格式化网格?
编辑: 我能知道为什么我被否决了吗?我几分钟前注册了我的帐户来问这个问题,但我认为我提供了足够的信息,我在 Stack Overflow 上找不到这个问题。
以下是我准备您想要的输出的方式:
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 + " |")
三个关键部分。
第一种是使用 enumerate
遍历棋盘的行并获取每一行的索引。我们需要索引来告诉行后的行应该如何格式化。
下一个关键位是去掉零。我使用列表理解 [x if x != 0 else " " for x in row]
将每个 0
替换为一个 space 字符串。我现在想到 x or " "
会是一种更简洁(但可能不太可读)的 x if x != 0 else " "
.
最后一个棘手的问题是字符串格式。而不是写出字符串:
"| {} {} {} | {} {} {} | {} {} {} |"
完整的,我使用字符串连接和重复来更简洁地创建它:
("|" + " {} {} {} |"*3)
这用作 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 | |
+---+---+---+---+---+---+---+---+---+
制作人:
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)