2017-10-12 11 views
3

は、文字が、私が反復処理し、ちょうど'#'Pythonジェネレータから抜け出すことはできますか?

で取得することができます ない '#'

になるまで、私はを巡回したいとだけ最初の数文字を取得するには、次の文字列

long_string = '#' * 4 + 'a' * 10 + '#' * 4 

print(long_string) 

####aaaaaaaaaa#### 

を考えてみましょう

''.join(x for x in long_string if x.startswith('#')) 

'########' 

これは多すぎます。

私はそれを破るするための条件に遭遇したとき、これは、反復処理を停止この

def gen_break(long_string, mychar): 
    i = iter(long_string) 
    s = next(i) 
    while s == mychar: 
     yield s 
     s = next(i) 

''.join(gen_break(long_string, '#')) 

'####' 

のような何かをしたいです。 (this for this in that)の構文の中でこれをもっとうまくやり遂げる方法はありますか?


注:
これは私が求めています質問を強調するために、不自然な例でした。私はこのサンプル文字列を解析する方法を探していません。私は、好ましくは理解の構文を使用して、エレガントな方法で反復を打破する方法を探しています。これはその後、生成

from itertools import takewhile 

''.join(takewhile(lambda x:x == '#','#### foo bar ### qux')) 

+6

genexpでは '中断 'できません。ただし、itertools.takewhileを使用することはできます。 – user2357112

+3

[itertools.takewhile](https://docs.python.org/2/library/itertools.html#itertools.takewhile)は正確にこれを行います – Wondercricket

+0

状況/発電機を故意に設定して、あなたが脱出したい点は? – toonarmycaptain

答えて

5

あなたがitertools.takewhile機能を使用することができます

>>> ''.join(takewhile(lambda x:x == '#','#### foo bar ### qux')) 
'####' 

だから限りtakewhileの述語(最初の引数)が満たされるように、それは反復可能で反復 (2番目の引数)。述語が満たされない瞬間から、takewhileが停止します。 iterable/iteratorの残りの部分を使い果たすことはありません。

あなたが知っている限り、あなたはリストの理解/ジェネレータ/ ...構文でこれを行うことはできません。

関連する問題