20

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

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ジェネレータ式では理解されません。ですから、私の質問は、新しい値が生成されなくても計算を続行しないように、停止条件を指定してジェネレーター式を作成するにはどうすればよいかということです。

4

2 に答える 2

26

との構文は最も明確takewhile()dropwhile()はないため、質問の実際の例を次に示します。

>>> [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の作成者が、これらの関数を非推奨にするかどうかを疑問視していることを知ってください。

于 2011-08-30T04:57:51.767 に答える
14

itertools(takewhile()頭に浮かぶ)のさまざまな機能が役立ちます。

于 2011-03-31T20:29:25.860 に答える