查找嵌套列表中元素的所有索引
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。但请记住,只有满足上述条件,新元组才会附加到结果中。
井字棋盘表示为 [['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。但请记住,只有满足上述条件,新元组才会附加到结果中。