如何解决如何更有效地打印数独网格
我正在终端中编写数独游戏,我想将网格打印到控制台,周围有一个正方形,如下图所示。 我的代码没有问题,只是效率低下。
我想让它更高效、更简短(使用列表推导式、字符串乘法等)。 董事会是这样定义的, board = [[_ for _ in range(9)] for _ in range(9)]
这是我正在使用的功能:
def Print_Board(board):
print("\n-------------------------")
for i in range(9):
for j in range(9):
if board[i][j] is not None:
if j == 0:
print("|",end=" ")
print(f"{board[i][j]} ",end="")
if (j + 1) % 3 == 0:
print("|",end=" ")
if (i + 1) % 3 == 0:
print("\n-------------------------",end=" ")
print()
解决方法
你可以建立一个棋盘格式并将所有数据扔给它:
bar = '-------------------------\n'
lnf = '|' +(' {:}'*3 + ' |')*3 + '\n'
bft = bar + (lnf*3+bar)*3
print(bft.format(*(el for rw in board for el in rw)))
当然,您只需要构建一次格式。之后就只是打印了。
JonSG 在评论中建议将其封装在闭包中:
def make_board_printer():
bar = '-------------------------\n'
lnf = '|' +(' {:}'*3 + ' |')*3 + '\n'
bft = bar + (lnf*3+bar)*3
return (lambda bd:print(bft.format(*(el for rw in bd for el in rw))))
是一个返回板式打印机函数的函数:
# make a printer:
b_print = make_board_printer()
# then as needed
b_print(board)
,
你可以这样做:
def print_board(board):
print("\n-------------------------")
for row_num,row in enumerate(board):
print("|",end=" ")
for col_num,item in enumerate(row):
print(item,end=" ")
if (col_num + 1) % 3 == 0:
print("|",end=" ")
if (row_num + 1) % 3 == 0:
print("\n-------------------------",end=" ")
print()
if __name__ == '__main__':
print_board(board=[range(9) for _ in range(9)])
,
这是针对您的问题的(不是更易读的)解决方案:
board = [range(1,10) for i in range(9)]
print("-"*25)
for idx,row in enumerate(board):
rowStr = " | ".join([" ".join(map(str,row[i:i+3])) for i in range(0,len(row),3)])
print(f'| {rowStr} |')
if (idx+1) % 3 == 0:
print("-"*25)
输出:
-------------------------
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
-------------------------
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
-------------------------
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
| 1 2 3 | 4 5 6 | 7 8 9 |
-------------------------
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。