首页 > 解决方案 > 在 Python 的 for 循环中使用 range(len(x)) 时添加索引有什么影响?例如范围(len(x [0])

问题描述

我对编码很陌生,并且正在使用 Python。在在线课程中,我正在创建一个极小极大函数来尝试对 AI 进行编程以玩 Connect 4。以下代码构成了评估函数,以计算玩家“X”和玩家“O”是否有任何“两条条纹”(在现在一个方向)通过计算,给定棋盘上的位置,其右侧列中的棋子是否具有相同的符号。

def my_evaluate_board(board):
  if has_won(board, "X"):
    return float("Inf")
  elif has_won(board, "O"):
    return -float("Inf")
  else:
    x_two_streak = 0
    o_two_streak = 0
    for col in range(len(board)-1):
      for row in range(len(board[0])):
        if board[col][row] == "X" and board[col + 1][row] == "X":
          x_two_streak += 1
    for col in range(len(board)-1):
      for row in range(len(board[0])):
        if board[col][row] == "O" and board[col + 1][row] == "O":
          o_two_streak += 1
    return x_two_streak - o_two_streak

我明白在 for 循环中:

for col in range(len(board)-1):

-1 就位是因为代码正在寻找每列的右侧以连续查找两个部分,这可以防止循环尝试查找最后一列的右侧。

我不明白为什么在下一行代码中添加索引正在做它正在做的事情:

for row in range(len(board[0])):

在我的脚本的其他地方,我打印了这一行的输出,有无索引,但无论我放什么索引,我都会得到相同的结果。该板有 7 列,每列有 6 行。见下文:

print(range(len(new_board[0])))
# this returns: range(0, 6)

print(range(len(new_board)))
# this prints: range(0, 7)

并证明我对指数价值没有任何影响的意思:

print(range(len(new_board[4])))
# this prints: range(0, 6)

我想这样做的目的是将函数循环遍历行的次数减少 1,因为行比列少 1。

请有人解释为什么在 for 循环中添加索引会使函数以这种方式运行?

标签: pythonfor-loopindexingrange

解决方案


看起来您的数据被组织为一个矩阵,在这种情况下,它被实现为一个列表列表。这意味着 board 的每个元素都是代表一列的列表。列的长度表示矩阵的行数。每列将具有相同的长度,因此您可以选择其中任何一个来查找行数。最佳选择是第一列(索引为 [0] 的列)。

为了更清楚,你可以使用

n_cols = len(board)
n_rows = len(board[0])

并将你的循环重写为

for row_index in range(n_rows):
    for column_index in range(n_cols):

尝试更好地理解这种结构,您可以创建自己的样本矩阵

l = [[1, 2, 3], [4, 5, 6]]

因此您创建了一个形状为 2x3 的矩阵

print(len(l))

将返回 2,而

print(l[0])
print(l[1])

将返回 [1 ,2, 3] 和 [3, 4, 5]。它们中的每一个都有长度 3(所以print(len(l[0])print(len(l[1])都将返回 3)。可视化矩阵的更好方法是将其转换为 numpy 数组

import numpy
print(numpy.array(l))

将以更熟悉的形状向您展示矩阵

[[1 2 3]
 [2 3 4]]

推荐阅读