Ошибка «генератор» не является подпиской - PullRequest
30 голосов
/ 09 июня 2011

Почему я получаю эту ошибку из строки 5 моего кода при попытке решить проблему Project Euler 11?

for x in matrix:
    p = 0
    for y in x:
        if p < 17:
            currentProduct = int(y) * int(x[p + 1]) * int(x[p + 2]) * int(x[p + 3])
            if currentProduct > highestProduct:
                print(currentProduct)
                highestProduct = currentProduct
        else:
                break
            p += 1
'generator' object is not subscriptable

1 Ответ

39 голосов
/ 09 июня 2011

Ваше значение x является объектом-генератором, то есть Iterator: оно генерирует значения по порядку, так как они запрашиваются циклом for или путем вызова next(x).

Вы пытаетесь получить к нему доступ, как к списку или другому типу Sequence, который позволяет получить доступ к произвольным элементам по индексу как x[p + 1].

Если вы хотите посмотреть значения из выходных данных вашего генератора по индексу, вы можете преобразовать их в список:

x = list(x)

Это решает вашу проблему и подходит в большинстве случаев. Однако для этого требуется генерировать и сохранять все значения одновременно, поэтому может произойти сбой, если вы имеете дело с очень длинным или бесконечным списком значений или значения очень велики.

Если вам просто нужно одно значение из генератора, вы можете вместо этого использовать itertools.islice(x, p), чтобы отбросить первые p значения, а затем next(...), чтобы получить то, что вам нужно. Это избавляет от необходимости хранить несколько элементов в памяти или вычислять значения сверх того, который вы ищете.

import itertools

result = next(itertools.islice(x, p))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...