我有一个字符(例如“a”),我需要检查一个字符串(例如“aaaabcd”)以查看连续出现“a”的次数(在这种情况下处理停止在“b”并返回值是 4)。
我有这样的事情:
def count_char(str_, ch_):
count = 0
for c in str_:
if c == ch_:
count += 1
else:
return count
所以我在想......有没有更好/更pythonic/更简单的方法来做到这一点?
一个选项使用itertools.takewhile
,
>>> from itertools import takewhile
>>> str_ = 'aaaabcd'
>>> ch_ = 'a'
>>> sum(1 for _ in takewhile(lambda x: x == ch_, str_))
4
该re.match
函数将开始查找字符串的开头
m = re.match(r'[%s]+' % ch_, str_)
return m.end() if m else 0
如果您想要字符串的任何部分中的最大字符数:
max(len(x) for x in re.findall(r'[%s]+' % ch_, str_))
如果您只关心字符串的开头,则可以使用lstrip
并比较长度:
>>> x = "aaaabcd"
>>> len(x) - len(x.lstrip("a"))
4
也许不是最有效的方法,但很可能是最简单的。
>>> from itertools import takewhile
>>> sum(1 for c in takewhile('a'.__eq__, 'aaaabcd'))
4
itertools
您可以从模块中借用:
from itertools import takewhile, groupby
def startcount1(s, c):
group = takewhile(lambda x: x == c, s)
return len(list(group))
def startcount2(s, c):
key, group = next(groupby(s))
return len(list(group)) if key == c else 0
之后
tests = ['aaaabcd', 'baaaabcd', 'abacadae', 'aaabcdaaa']
for test in tests:
print test,
for f in count_char, startcount1, startcount2:
print f(test, 'a'),
print
会产生
aaaabcd 4 4 4
baaaabcd 0 0 0
abacadae 1 1 1
aaabcdaaa 3 3 3
如果你真的在乎,你可以使用sum(1 for _ in ..)
而不是len(list(..))
避免实现列表,但我发现我在老年时不太关心这样的事情。:^)