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

时间:2020-04-14 05:35:18

标签: python-3.x list indexing nested-loops tic-tac-toe

井字游戏,其中棋盘表示为[['x','x','x'],['','',''], ['','','']]

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

完成函数empty_squares(board),该函数返回元组列表,其中每个元组是空正方形的(行,列)。

这是我到目前为止所拥有的,它返回所有平方的元组,但是我只想要空的元组。

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

3 个答案:

答案 0 :(得分:0)

添加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

答案 1 :(得分:0)

您还可以使用enumerate进行简单的列表理解:

l = [['x','x','x'],
     ['','',''],
     ['','','']]

# r = [(x[0],y[0]) for x in enumerate(l) for y in enumerate(x[1]) if y[1] =='']
# More understandable way,suggested by Mr.MisterMiyagi.
r = [(x, y) for x, row in enumerate(l) for y, field in enumerate(row) if field == '']

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

或者,如果您要创建一个函数来执行此操作,则可以定义一个函数:

l = [['x','x','x'],
     ['','',''],
     ['','','']]
def empty_squares():
    return [(x, y) for x, row in enumerate(l) for y, field in enumerate(row) if field == '']

empty_squares(l)
# [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

答案 2 :(得分:0)

您可以略微更改您的方法,使其更具“ 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(例如,列表,列表列表,对象列表等),并为每个元素返回一个元组,该元组包含一个计数(从起始值开始,默认为0)以及从迭代获得的值。可迭代的。来源: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)的第一个“迭代”结果将是:row_idx = 0 row = ['x', 'x', 'x']
  • for col_idx, item in enumerate(row)遍历row,选择row的每个元素并将其分配给item。因此,例如,enumerate(row)的第一个“迭代”结果将是:col_idx = 0 item = 'x'
  • if item == ' '执行检查,如果选取的字符(在您的情况下,您有两个选择'x''或' ')是否等于单个空格...
  • ...,如果check为true,则形成元组(row_idx, col_idx)
  • 将整个对象括在方括号[..]中,以组成元组的 list 。但是请记住,只有满足上述条件时,才会在结果中附加新的元组。