1. ホーム
  2. python

[解決済み] "'generator' object is not subscriptable "エラー

2022-02-13 14:16:18

質問内容

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