web-dev-qa-db-ja.com

「「ジェネレータ」オブジェクトは添え字付けできません」エラー

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

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))
_
44
Jeremy Banks