Project Euler Problem 11を解決しようとすると、コードの5行目からこのエラーが発生するのはなぜですか?
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
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))
_