在Python中计算重复序列的最长出现次数
怎么才能最简单地计算一个字符串中某个字符连续出现的最长次数呢?比如,在下面这个字符串中,字符“b”连续出现的最长次数是:
my_str = "abcdefgfaabbbffbbbbbbfgbb"
是6,因为其他连续出现的次数分别是3和2,都是比较短的。那我该怎么用Python来实现这个呢?
5 个回答
6
这是我一个非常无聊、效率低下、简单直接的计数方法(interjay的要好得多)。请注意,我是在这个小文本框里写的,里面没有解释器,所以我没有测试过,可能还犯了一些很傻的错误,而校对也没有发现。
my_str = "abcdefgfaabbbffbbbbbbfgbb"
last_char = ""
current_seq_len = 0
max_seq_len = 0
for c in mystr:
if c == last_char:
current_seq_len += 1
if current_seq_len > max_seq_len:
max_seq_len = current_seq_len
else:
current_seq_len = 1
last_char = c
print(max_seq_len)
13
这里有一个一行代码:
max(len(list(y)) for (c,y) in itertools.groupby(my_str) if c=='b')
解释:
itertools.groupby
这个工具会把连续相同的字符分成一组,并且提供一个可以遍历这些字符的迭代器。对于每一组这样的迭代器,使用 len(list(y))
可以得到这一组里有多少个字符。然后,找出这些数量中的最大值(针对特定的字符),就能得到我们想要的结果。
14
这里有一个正则表达式的例子:
import re
my_str = "abcdefgfaabbbffbbbbbbfgbb"
len(max(re.compile("(b+b)*").findall(my_str))) #changed the regex from (b+b) to (b+b)*
# max([len(i) for i in re.compile("(b+b)").findall(my_str)]) also works
编辑,Mine 和 interjays 的对比
x=timeit.Timer(stmt='import itertools;my_str = "abcdefgfaabbbffbbbbbbfgbb";max(len(list(y)) for (c,y) in itertools.groupby(my_str) if c=="b")')
x.timeit()
22.759046077728271
x=timeit.Timer(stmt='import re;my_str = "abcdefgfaabbbffbbbbbbfgbb";len(max(re.compile("(b+b)").findall(my_str)))')
x.timeit()
8.4770550727844238