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
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))