如何在最后一次迭代中“跳过”某些内容?

问题描述 投票:0回答:1

所以我用 python 创建了 Tic Tac Toe 的简单小项目

Tic Tac Toe board in text with a, b, and c identifying columns and 0, 1, and 2 identifying rows

(同版文字形式):

     a   b   c

0    - | - | -

    -----------
1    - | - | -

    -----------
2    - | - | -

当我尝试仅使用循环来执行此操作时,我会得到诸如“|”之类的工件在行末尾和第 2 行下方的“---------”,而它只应该位于第 0 行和第 1 行下方。我可以使用 if 语句来规避此问题,但我想知道是否有更好的方法.

我原本有

def print_board():
    print("     a   b   c")
    print("")
    print("0    " + coords[columns[0]][rows[0]] + " | " + coords[columns[1]][rows[0]] + " | " + coords[columns[2]][rows[0]])
    print("   -------------")
    print("1    " + coords[columns[0]][rows[1]] + " | " + coords[columns[1]][rows[1]] + " | " + coords[columns[2]][rows[1]])
    print("   -------------")
    print("2    " + coords[columns[0]][rows[2]] + " | " + coords[columns[1]][rows[2]] + " | " + coords[columns[2]][rows[2]])

这是我能想到的最好的设计,而且它有效。

def print_board():
    print("     a   b   c", end="\n\n")
    for r in range(3):
        print(str(r) + "    ", end="")
        for c in range(3):
            print(coords[columns[c]][rows[r]], end="")
            if c != 2:
                print(" | ", end="")
        print("\n")
        if r != 2:
            print("   -------------")

但是,我觉得这样可能会更好。 具体来说,我想摆脱 if 语句但得到相同的结果。 所以我想知道是否可以在最后一次迭代中跳过循环的一部分?

python loops printing nested nested-loops
1个回答
0
投票

您可以使用嵌套列表推导式在一行中完成此操作,并使用列和行分隔符将它们连接起来。

values = [
  ["X", "X", "X"],
  ["X", "X", "X"],
  ["X", "X", "X"]
]

def print_board():
    print("\n  ----------\n".join([str(row) + "  " + " | ".join([val for val in values[row]]) for row in range(3)]))
    
print_board()

但这可能有点太晦涩了,所以你可以混合一下。

循环的第一个和最后一个情况有时必须被视为特殊情况。

在此示例中,我将第一行作为特殊情况打印,然后在循环中我首先打印分隔符,然后打印值

对于列,我使用不同的方法:将字符串构造为理解列表,然后使用

|
作为连接元素将其转换为字符串。

这当然是一种方法,但在问题中将第一个或最后一个元素单独视为特殊情况并不罕见。

values = [
  ["X", "X", "X"],
  ["X", "X", "X"],
  ["X", "X", "X"]
]

def print_board():
    # print the first row as a separate case
    print("0    " + " | ".join([val for val in values[0]]))
    
    for row in range(1, 3):
        print("   -------------")
        print(f"{row}    {' | '.join([val for val in values[row]])}")
    
print_board()


0    X | X | X
   -------------
1    X | X | X
   -------------
2    X | X | X

如果你愿意的话

© www.soinside.com 2019 - 2024. All rights reserved.