查找嵌套列表中元素的所有索引

Finding ALL indexes of elements in nested List

井字棋盘表示为 [['x', 'x', 'x'], [' ', ' ', ' '], [' ', ' ', ' ']]

我们想找出船上所有的空方块。板上的空方块位置将作为(行,列)元组返回。

完成函数empty_squares(board),其中returns元组列表,其中每个元组是空方块的(行,列)。

这是我目前所拥有的,它 returns 所有方块的元组,但我只想要空方块。

def empty_squares(board):
    check = ' '
    target_cell_list = []
    for i in range(len(board)):
        for j in range(len(board[i])):
            target_cell_list.append((i, j))
    return target_cell_list

添加 if 语句

def empty_squares(board):
    check = ' '
    target_cell_list = []
    for i in range(len(board)):
        for j in range(len(board[i])):
            if board[i][j] == " ":
                target_cell_list.append((i, j))
    return target_cell_list

您可以稍微改变一下您的方法,使其更 "pythonic"。避免嵌套的 for 循环,您可以使用带有内置 enumerate 语句的列表理解。所以 empty_sqares 可以看起来像这样:

def empty_sqares(board):
    return [(row_idx, col_idx) for row_idx, row in enumerate(board)
            for col_idx, item in enumerate(row) if item == ' ']

最重要的是想弄清楚 enumerate 的作用。简而言之,它遍历 iterable(例如列表、列表列表、对象列表等),并且对于每个元素 returns 一个包含计数(从开始默认为 0)和值的元组通过迭代 iterable 获得。资料来源:https://docs.python.org/3/library/functions.html#enumerate

那么代码中发生了什么:

  • for row_idx, row in enumerate(board) 遍历 board 中的行。因为 board(行)的项目是列表,所以 enumerate(board) 的连续结果是行索引(row_idx)和行内容(row,这是字符串列表)。例如,enumerate(board) 的第一个 "iteration" 结果将是:row_idx = 0 row = ['x', 'x', 'x'].
  • for col_idx, item in enumerate(row) 遍历 row,选取 row 的每个元素并将其分配给 item。因此,例如,enumerate(row) 的第一个 "iteration" 结果将是:col_idx = 0 item = 'x'.
  • if item == ' ' 执行检查是否选择的字符(在你的情况下你有两个选项 'x'' 或 ' ')等于单个 space ...
  • ... 如果检查为真,则形成元组 (row_idx, col_idx)
  • 整个内容都包含在方括号 [..] 中,以构成元组的 list。但请记住,只有满足上述条件,新元组才会附加到结果中。