如何更有效地打印数独网格

问题描述

我正在终端中编写数独游戏,我想将网格打印到控制台,周围有一个正方形,如下图所示。 我的代码没有问题,只是效率低下。

我想让它更高效、更简短(使用列表推导式、字符串乘法等)。 董事会是这样定义的, 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()

enter image description here

解决方法

你可以建立一个棋盘格式并将所有数据扔给它:

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 |
-------------------------

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...