Как я могу перебрать результат itertools.product ()?

avatar
Mechatrnk
1 июня 2020 в 12:19
222
1
0

Я пытаюсь реализовать алгоритм Q-Learning, мое пространство состояний содержит все возможные комбинации чисел 0,1,2 в векторе заданной длины.

Теперь я пытаюсь инициализировать Q-таблицу, полную нулей, которая будет иметь такое же количество строк, как и мое пространство состояний. И затем я хочу на каждом этапе пробегать по пространству состояний и проверять, какой из всех возможных векторов состояний находится прямо сейчас. Но это означает, что мне нужно добавить индекс itertools.product () Как я могу это сделать? потому что, когда я пытаюсь распечатать n-й вектор из продукта, он показывает ошибку, что продукт не подлежит подписке

Я пробовал это:

import itertools
NUMBER_OF_SECTORS = 6
state_space = itertools.product(*[[0, 1, 2]] * NUMBER_OF_SECTORS)
length = len(list(state_space)) # 729
       for obs in range(length):
            print(list(state_space[obs]))

Кроме того, есть ли возможность, как я могу избавиться от переменной length? Потому что, когда я определяю цикл for как: for obs in range(len(list(state_space))), он вообще не выполняется.

Большое спасибо

Источник
Osman Mamun
1 июня 2020 в 12:21
4

for i in itertools.product([[0, 1, 2]] * 6): do stuffs

chepner
1 июня 2020 в 12:30
1

Также itertools.product([0,1,2], repeat=NUMBER_OF_SECTORS). Вам не нужно предварительно вычислять список списков.

Mechatrnk
1 июня 2020 в 12:30
0

Хорошо, спасибо, но нет возможности не жестко закодировать диапазон итераций цикла for? потому что это в основном то, что делает моя переменная state_space, но когда я пытаюсь: for i in state_space: она ничего не делает.

chepner
1 июня 2020 в 12:31
1

state_space - итератор; передача его в list полностью расходует его, поэтому к тому времени, когда вы пытаетесь перебрать его, нечего читать.

chepner
1 июня 2020 в 12:32
1

Это также не индексируется в первую очередь; state_space[obs] не даст вам i -й элемент продукта.

Ответы (1)

avatar
chepner
1 июня 2020 в 12:36
2

Вы можете выполнить итерацию по экземпляру product только один раз: после этого он будет использован. list выполняет итерацию по экземпляру, чтобы создать список, длину которого вы вычисляете. Как только вы это сделаете, пространство состояний исчезнет; все, что у вас осталось, это длина.

Вам не нужно преобразовывать пространство состояний в список или вычислять его длину; вы можете просто перебирать его напрямую:

state_space = itertools.product([0,1,2], repeat=NUMBER_OF_SECTORS)
for state in state_space:
    print(state)