Каков эффект добавления индекса при использовании диапазона (len (x)) в a для l oop в Python? например, диапазон (len (x [0]) - PullRequest
1 голос
/ 03 апреля 2020

Я довольно новичок в кодировании и использую 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

Я понимаю, что в для l oop:

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

-1 имеет место, потому что код ищет справа от каждого столбца поиск двух фрагментов подряд, и это препятствует тому, чтобы l oop пытался искать справа от последний столбец.

Что я не понимаю, так это то, почему добавление индекса в следующей строке кода делает то, что делает:

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 строк меньше, чем столбцов.

Может, кто-нибудь объяснит, почему добавление индекса в для l oop заставляет функцию вести себя таким образом?

1 Ответ

1 голос
/ 03 апреля 2020

похоже, что ваши данные организованы в виде матрицы, то есть этот случай реализован в виде списка списков. Это означает, что каждый элемент доски представляет собой список, представляющий столбец. Длина столбца представляет количество строк вашей матрицы. Каждый столбец будет иметь одинаковую длину, поэтому вы можете выбрать любой из них, чтобы найти количество строк. Лучший выбор - первый столбец (индекс с индексом [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]]
...