2016-10-23 1 views
3

これが重複している場合は、すでにその後、申し訳ありません答え私は、forループを使用して、イテレータを生成することは簡単で、カウントitertoolsを読んでいた、と私はリスト内包でそれをやろうとしたとして、私はこの質問を越えItertoolsにBREAKを適用する方法はリスト内包表記でカウントされますか?

来ませんでしたしかし、私は

for x in itertools.count(5,2): 
    if x > 20: 
     break 
    else: 
     print(x) 
5 
7 
9 
11 
13 
15 
17 
19 

私はリスト内包でこれを実行しようとしましたforループを使用することによって、この問題

from itertools import * 

に直面しています

[x if x<20 else break for x in count(5,2)] 
    File "<ipython-input-9-436737c82775>", line 1 
    [x if x<20 else break for x in count(5,2)] 
        ^
SyntaxError: invalid syntax 

iはislice方法を試みたと私はどのように私は唯一の方法を数える使用して(休憩または任意のものを使用して)終了することができ、解答isliceメソッドを使用せずに

[x for x in itertools.islice(itertools.count(5),10)] 
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14] 

を得ましたか。

さらに、リスト内包表記で「ブレーク」を実装する方法は? takewhile

+0

なぜ「islice」が気に入らないのですか?リスト内には「中断」はありませんが、「takewhile」(https://docs.python.org/3/library/itertools.html#itertools.takewhile)があります。 – bereal

+1

なぜ 'range(5、20、2)'や 'range(5、15)'を使わないのですか? – falsetru

+0

それは好きなことではない、私はちょうど "このようにしていてもいないのですか?" @bereal – avimatta

答えて

5

はリスト内包やジェネレータ式の内部には、breakありませんが、あなたは、特定の条件に停止したい場合は、あなたが使用することができます。

>>> from itertools import takewhile, count 
>>> list(takewhile(lambda x: x < 20, count(5, 2))) 

[5、7、9、11、13、15、 17、19]

+0

takewhile ha、ありがとう – avimatta

+1

あなたは 'list(takewhile(int(20).__ gt__、count(5,2) )) '醜いラムダを取り除くために、それはかなり速くて速くなるでしょう。 –

+0

@PadraicCunninghamは速くはい。しかし、私はおそらく比較醜さに疑問を呈します。 – bereal

関連する問題