web-dev-qa-db-fra.com

Erreur "l'objet" générateur "n'est pas indexable"

Pourquoi est-ce que j'obtiens cette erreur, de la ligne 5 de mon code, lorsque j'essaie de résoudre le problème 11 de Project Euler?

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
31
Matthew Hannah

Votre x valeur est un objet générateur, qui est un Iterator : il génère des valeurs dans l'ordre, car elles sont demandées par une boucle for ou en appelant next(x) .

Vous essayez d'y accéder comme s'il s'agissait d'une liste ou d'un autre type Sequence , qui vous permet d'accéder à des éléments arbitraires par index en tant que x[p + 1].

Si vous souhaitez rechercher les valeurs de la sortie de votre générateur par index, vous pouvez le convertir en une liste:

x = list(x)

Cela résout votre problème et convient dans la plupart des cas. Cependant, cela nécessite de générer et d'enregistrer toutes les valeurs à la fois, donc cela peut échouer si vous avez affaire à une liste de valeurs extrêmement longue ou infinie, ou si les valeurs sont extrêmement grandes.

Si vous avez juste besoin d'une seule valeur du générateur, vous pouvez utiliser à la place itertools.islice(x, p) pour supprimer les premières valeurs de p, puis next(...) pour prenez celui dont vous avez besoin. Cela élimine le besoin de conserver plusieurs éléments en mémoire ou de calculer des valeurs au-delà de celle que vous recherchez.

import itertools

result = next(itertools.islice(x, p))
44
Jeremy Banks