web-dev-qa-db-ja.com

リスト内包表記またはジェネレータ式での使用

リスト内包表記/ジェネレータ式でifforを次のように使用できます。

list(i for i in range(100) if i*i < 30)

これが最も効率的ではないことはわかっていますが、条件がはるかに複雑になる可能性があるため、これは単なる例です。ただし、これはまだ100回の反復を経て、最初の6でのみ値を生成します。次のようなもので停止する場所をジェネレータ式に指示する方法はありますか。

list(i for i in range(100) while i*i < 30)

ただし、whileはジェネレータ式では理解されません。したがって、私の質問は、新しい値が生成されなくても計算を続行しないように、停止条件を使用してジェネレータ式を作成するにはどうすればよいかということです。

19
highBandWidth

itertoolstakewhile()が頭に浮かぶ)のさまざまな関数が役立ちます。

takewhile()dropwhile()の構文はclearestではないため、ここに実際の質問の例を示します。 :

>>> [i for i in itertools.takewhile(lambda x: x*x<30, range(10))]
[0, 1, 2, 3, 4, 5]
>>> [i for i in itertools.dropwhile(lambda x: x*x<30, range(10))]
[6, 7, 8, 9] 

Itertoolsの作者が 質問した これらの関数を非推奨にするかどうかを知ってください。

25
dawg