2016-07-16 9 views
2

無限の発電機を使用する場合は、ifを使用して、アイテムをリストに入力しないようにすることができますが、ループを解除することはできません。リストの理解を破る方法はありますか?

これは実際にクラッシュしてハングします。でもKeyboardInterruptは私を保存(理由BTWがある?)できない

import itertools 
a = [x for x in itertools.count() if x<10] 

私は自分自身の無限のジェネレータ

def mygen(): 
    i=0 
    while True: 
     yield i 
     i +=1 

を使用している場合、これは明らかに、今KeyboardInterrupt

a = [x for x in mygen() if x<10] 

まで実行されますが適切なforループのために、条件が満たされたときに中断することがあります

a = [] 
for x in itertools.count(): 
    a.append(x) 
    if x>9: 
     break 

私の質問:リストの理解を破るいくつかの方法がありますか?

+1

リストの理解は*クルーボーイ*ではありません。 'x 'が' count'オブジェクト内のすべての項目を実行しようとし、 '10'より小さいもののみを返します。それはどんどん進んでいきます。 。 。 –

答えて

6

使用itertools.takewhile条件が満たされなくなった後、反復を中止しないように...:

import itertools 

a = [x for x in itertools.takewhile(lambda L: L < 10, itertools.count())] 
# a = list(itertools.takewhile(lambda L: < 10, itertools.count())) 

ありますが(そう反復可能な制限、それ自体はリスト-COMPから抜け出すための方法ではありませんtakewhileまたはisliceなど...行く方法です...)

関連する問題