【问题标题】:What is the effect of adding an index when using range(len(x)) in a for loop in Python? e.g. range(len(x[0])在 Python 的 for 循环中使用 range(len(x)) 时添加索引有什么作用?例如范围(长度(x [0])
【发布时间】:2020-04-03 10:29:06
【问题描述】:

我对编码很陌生,并且正在使用 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 循环中添加索引会导致函数出现这种行为?

【问题讨论】:

    标签: python for-loop indexing range


    【解决方案1】:

    看起来您的数据被组织为一个矩阵,在这种情况下被实现为一个列表列表。这意味着 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]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 2021-10-08
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多