考虑以下字符串
long_string = '#' * 4 + 'a' * 10 + '#' * 4
print(long_string)
####aaaaaaaaaa####
我想循环浏览并获得前几个字符,直到该字符不 a '#'
我可以迭代并获得'#'
''.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)
语法中更优雅地执行此操作?
注意:
这是一个人为的例子,以突出我提出的问题。我没有找到解析这个示例字符串的方法。我正在寻找一种以优雅的方式突破迭代的方法,最好使用理解语法。
答案 0 :(得分:5)
您可以使用a plugin功能:
from itertools import takewhile
''.join(takewhile(lambda x:x == '#','#### foo bar ### qux'))
然后生成:
>>> ''.join(takewhile(lambda x:x == '#','#### foo bar ### qux'))
'####'
因此只要满足takewhile
的谓词(第一个参数),它就会迭代迭代(第二个参数)。从谓词不满意的那一刻起,takewhile
就会停止。它不会耗尽可迭代/迭代器的剩余部分。
据我所知,你不能用list comprehension / generator / ...语法来做到这一点。