如何从包含编号行和列的列表列表中打印网格

时间:2014-02-28 20:11:40

标签: python list printing python-3.3 grid-layout

我正在尝试创建一个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 :(得分: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()