微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?