计算Python中重复序列的最长出现次数

10 python string

计算字符串中某个字符的最长连续重复的最简单方法是什么?例如,以下字符串中"b"的最长连续重复:

my_str = "abcdefgfaabbbffbbbbbbfgbb"
Run Code Online (Sandbox Code Playgroud)

将是6,因为其他连续重复更短(分别为3和2).我如何在Python中执行此操作?

int*_*jay 10

这是一个单行:

max(len(list(y)) for (c,y) in itertools.groupby(my_str) if c=='b')
Run Code Online (Sandbox Code Playgroud)

说明:

itertools.groupby将返回连续相同字符组,以及该组中所有项目的迭代器.对于每个这样的迭代器,len(list(y))将给出组中的项目数.取最大值(对于给定的字符)将给出所需的结果.


Mar*_*ark 10

一个正则表达式的例子怎么样:

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
Run Code Online (Sandbox Code Playgroud)

编辑,我和对话

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
Run Code Online (Sandbox Code Playgroud)


Jos*_*ght 6

这是我真正无聊,低效,直接的计数方法(interjay's更好).注意,我在这个没有解释器的小文本字段中写了这个,所以我没有测试它,我可能犯了一个非常愚蠢的错误,证明读取没有捕获.

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)
Run Code Online (Sandbox Code Playgroud)