2017-10-12 75 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)語法中更優雅地執行此操作?


注:
這是爲了突出我問的問題一個人爲的例子。我沒有找到解析這個示例字符串的方法。我正在尋找一種以優雅的方式打破迭代的方式,最好使用理解語法。

+6

你不能在基因xp中「突破」。不過,你可以使用'itertools.takewhile'。 – user2357112

+3

[itertools.takewhile](https://docs.python.org/2/library/itertools.html#itertools.takewhile)完全是這樣的 – Wondercricket

+0

您可以故意設置您的情況/發生器,以便它精確地導致錯誤你想突破的點? – toonarmycaptain

回答

5

可以使用itertools.takewhile功能:

from itertools import takewhile 

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

這就產生:

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

所以只要takewhile謂詞(第一個參數)成立,它通過迭代迭代(第二個參數)。從謂詞不滿意的那一刻起,takewhile將停止。它不會耗盡iterable/iterator的其餘部分。

據我所知,你不能用list comprehension/generator/...語法來做這件事。

相關問題