2

我有一个字符(例如“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/更简单的方法来做到这一点?

4

5 回答 5

4

一个选项使用itertools.takewhile,

>>> from itertools import takewhile
>>> str_ = 'aaaabcd'
>>> ch_ = 'a'
>>> sum(1 for _ in takewhile(lambda x: x == ch_, str_))
4
于 2013-06-02T18:25:58.587 回答
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_))
于 2013-06-02T18:16:02.763 回答
2

如果您只关心字符串的开头,则可以使用lstrip并比较长度:

>>> x = "aaaabcd"
>>> len(x) - len(x.lstrip("a"))
4

也许不是最有效的方法,但很可能是最简单的。

于 2013-06-02T20:49:04.350 回答
0
>>> from itertools import takewhile
>>> sum(1 for c in takewhile('a'.__eq__, 'aaaabcd'))
4
于 2013-06-02T20:40:27.127 回答
0

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(..))避免实现列表,但我发现我在老年时不太关心这样的事情。:^)

于 2013-06-02T18:26:51.600 回答