如何从列表中打印带有编号行和列的网格

0 投票
1 回答
4235 浏览
提问于 2025-04-17 20:23

我正在尝试创建一个可以改变大小的网格,大小是 n_rows 行和 n_columns 列。这是我的代码,它接受一个列表的列表和两个整数作为维度:

def _print_board(game_state: list, n_rows: int, n_columns: int)-> None:
    for i in range(n_rows):
        if i+1 < 10:
            print(i+1, '', end=' ')
        else:
            print(i+1, end=' ')
        for j in range(n_columns):
            if game_state[j][i] == NONE:
                print('.', end=' ')
            elif game_state[j][i] == WHITE:
                print(WHITE, end=' ')
            elif game_state[j][i] == BLACK:
                print(BLACK, end=' ')
        else:
            print('\n',end='')

我得到的输出是:

1  . . . . . . . . . . . . . . . . 
2  . . . . . . . . . . . . . . . . 
3  . . . . . . . . . . . . . . . . 
4  . . . . . . . . . . . . . . . . 
5  . . . . . . . . . . . . . . . . 
6  . . . . . . . . . . . . . . . . 
7  . . . . . . . . . . . . . . . . 
8  . . . . . . . B W . . . . . . . 
9  . . . . . . . W B . . . . . . . 
10 . . . . . . . . . . . . . . . . 
11 . . . . . . . . . . . . . . . . 
12 . . . . . . . . . . . . . . . . 
13 . . . . . . . . . . . . . . . . 
14 . . . . . . . . . . . . . . . . 
15 . . . . . . . . . . . . . . . . 
16 . . . . . . . . . . . . . . . .

所以我得到了编号的行,但我不知道怎么正确格式化编号的列,也就是说,每个点要和行列号对齐。我想要的效果是这样的,但每个点也要和列号对齐:

   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
1  . . . . . . . . . . . . . . . . 
2  . . . . . . . . . . . . . . . . 
3  . . . . . . . . . . . . . . . . 
4  . . . . . . . . . . . . . . . . 
5  . . . . . . . . . . . . . . . . 
6  . . . . . . . . . . . . . . . . 
7  . . . . . . . . . . . . . . . . 
8  . . . . . . . B W . . . . . . . 
9  . . . . . . . W B . . . . . . . 
10 . . . . . . . . . . . . . . . . 
11 . . . . . . . . . . . . . . . . 
12 . . . . . . . . . . . . . . . . 
13 . . . . . . . . . . . . . . . . 
14 . . . . . . . . . . . . . . . . 
15 . . . . . . . . . . . . . . . . 
16 . . . . . . . . . . . . . . . .

列号可以放在上面或下面,但我更喜欢放在上面。我该怎么做才能让点和列号对齐,并且不会有两个数字悬在边缘?网格的最大尺寸是16,所以这是我会打印的最大网格。

1 个回答

0

解决这个问题最简单的方法是把所有数字格式化成两位数:

def _print_board(game_state):
    print(" ".join("{0:2d}".format(i) if i else "  " # or 0:02d to pad with zero
                   for i in range(len(game_state[0]) + 1)))
    for i, row in enumerate(game_state, 1):
        print("{0:2d}".format(i), end=" ")
        print("".join(" {0} ".format(col if col != NONE else ".") for col in row))

注意,如果你可以从game_state中获取大小,就不需要传递这些大小。对于一个12x4的网格,这样做会给我:

    1  2  3  4  5  6  7  8  9 10 11 12
 1  .  .  .  .  .  .  .  .  .  .  .  . 
 2  .  .  .  .  .  .  .  .  .  .  .  . 
 3  .  .  .  .  .  .  .  .  .  .  .  . 
 4  .  .  .  .  .  .  .  .  .  .  .  . 

稍微扩展一下上面的函数:

def _print_board(game_state):
    # headers
    for i in range(len(game_state[0]) + 1):
        if i == 0:
            # column for row numbers
            print("   ", end="")
        else:
            # column headers
            print("{0:2d} ".format(i), end="")
    print()
    for i, row in enumerate(game_state, 1):
        # row number
        print("{0:2d} ".format(i), end="")
        for col in row:
            # row data
            if col == NONE:
                print(" {0} ".format("."), end="")
            else:
                print(" {0} ".format(col), end="")
        print()

撰写回答