1. ホーム
  2. python

[解決済み] ジェネレーター出力の長さ[duplicate]。

2022-05-01 04:35:58

質問

Python はイーガーイテラブルの長さを取得するための素晴らしいメソッドを提供します。 len(x) ということです。しかし、ジェネレータ内包や関数で表現される遅延反復記号に対する同様のものは見つかりませんでした。もちろん、以下のようなものを書くのは難しくない。

def iterlen(x):
  n = 0
  try:
    while True:
      next(x)
      n += 1
  except StopIteration: pass
  return n

でも、自転車を再実装しているような感覚はぬぐえませんね。

(この関数は引数を破壊してしまうので、本当にそんな関数は存在しないのかもしれません。私の場合は問題ではありませんが)。

追伸:最初の回答についてですが、はい、次のようなものです。 len(list(x)) も有効ですが、その場合、メモリの使用量が大幅に増加します。

追伸:再確認しました... 追伸は気にしないでください、試している間に間違いがあったようです。ご迷惑をおかけして申し訳ありません。

解決方法は?

一般的なケースではできないので、ありません。もし、怠惰な無限生成器があったらどうでしょうか? 例えば

def fib():
    a, b = 0, 1
    while True:
        a, b = b, a + b
        yield a

これは決して終了することなく、フィボナッチ数を生成します。 フィボナッチ数を好きなだけ得るには next() .

もし本当にアイテムの数を知る必要があるなら、いずれにせよ1回で線形に反復することはできないので、通常のリストなど別のデータ構造を使用すればよい。