嵌套列表理解与 if 相结合

Nested list comprehensions combined with an if

我正在尝试遍历包含我的游戏字段 (TicTacToe) 的列表。此列表如下所示:

['X', '_', '_']
['O', 'X', '_']
['_', 'O', 'X']

我想生成一个包含所有 X 或 Os 的索引的列表。我的功能看起来像这样:

indicies = []
for x,y in enumerate(self.gameField):
    for b,c in enumerate(y):
        if c == 'X':
            indicies.append((x,b))

这工作正常,但我想使用列表理解来做同样的事情。我想,这可能会奏效:

indicies = [[(x,b) for b,c in enumerate(y) if c == 'X'] for x,y in enumerate(self.gameField)][0]

但结果并不如预期。

教程和 Whosebug 无法帮助我理解嵌套列表的列表理解。也许有人可以告诉我正确的方法或给我指点一个好的教程。

你的循环的理解版本是

[(x,b) for (x,y) in enumerate(self.gameField)
     for (b,c) in enumerate(y) if c=='X']

这是一个包含两个 for 子句的列表理解,而不是一个列表理解包含另一个列表理解。

假设您想要行的网格样式布局,x 和 o 的列索引,您可以这样做

grid = [
    ['X', '_', '_'],
    ['O', 'X', '_'],
    ['_', 'O', 'X']
]

x_indicies = [(ir,i) for ir, row in enumerate(grid) for i, v in enumerate(row) if v == 'X']
o_indicies = [(ir,i) for ir, row in enumerate(grid) for i, v in enumerate(row) if v == 'O']
print(x_indicies, o_indicies, sep="\n")

输出

[(0, 0), (1, 1), (2, 2)]
[(1, 0), (2, 1)]