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

计算Python中重复序列的最长出现次数,python,string,Python,String,计算字符串中某个字符最长连续重复次数的最简单方法是什么?例如,以下字符串中“b”的最长连续重复: my_str = "abcdefgfaabbbffbbbbbbfgbb" 应该是6,因为其他连续的重复都比较短(分别是3和2)。我如何在Python中做到这一点?这是我真正枯燥、低效、简单的计数方法(interjay的更好)。注意,我在这个小文本字段中写了这个,它没有解释器,所以我没有测试它,我可能犯了一个非常愚蠢的错误,校对没有发现 my_str = "abcdefgfaabbbffbbbbbb

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

my_str = "abcdefgfaabbbffbbbbbbfgbb"

应该是6,因为其他连续的重复都比较短(分别是3和2)。我如何在Python中做到这一点?

这是我真正枯燥、低效、简单的计数方法(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)
这是一条单行线:

max(len(list(y)) for (c,y) in itertools.groupby(my_str) if c=='b')
说明:


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

正则表达式示例如何:

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
编辑、挖掘与交互

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

使用运行长度编码:

import numpy as NP

signal = NP.array([4,5,6,7,3,4,3,5,5,5,5,3,4,2,8,9,0,1,2,8,8,8,0,9,1,3])

px, = NP.where(NP.ediff1d(signal) != 0)
px = NP.r_[(0, px+1, [len(signal)])]
# collect the run-lengths for each unique item in the signal
rx = [ (m, n, signal[m]) for (m, n) in zip(px[:-1], px[1:]) if (n - m) > 1 ]

# get longest:
rx2 = [ (b-a, c) for (a, b, c) in rx ]
rx2.sort(reverse=True)

# returns: [(4, 5), (3, 8)], ie, '5' occurs 4 times consecutively, '8' occurs 3 times consecutively 

以下是我的代码,虽然效率不高,但似乎有效:

def LongCons(mystring):
    dictionary = {}
    CurrentCount = 0
    latestchar = ''

    for i in mystring:
        if i == latestchar:
            CurrentCount += 1
            if dictionary.has_key(i):
                if CurrentCount > dictionary[i]:
                    dictionary[i]=CurrentCount
        else:
            CurrentCount = 1
            dictionary.update({i: CurrentCount})
            latestchar = i
    k = max(dictionary, key=dictionary.get)
    print(k, dictionary[k])
    return

您可能需要更新循环中的某个地方的
last\u char
;除此之外,+1用于提供真正最简单的方法:这是程序员需要较少概念/技能的方法。顺便说一句,这不是“效率低下”:任何解决方案都需要查看字符串上的所有字符以提供正确的结果,因此其成本至少为O(n):您的方法的时间成本为O(n),因此效率相当高。稍微提高效率的方法是更新
else:
块上的
max_seq_len
,因此它是每个序列更新一次,而不是每个字符更新一次。好的,忽略我关于更新
最后一个字符的观点,Ignacio刚刚修复了它;)谢谢伊格纳西奥;)(我的意思只是说你需要做多少键入)我可能会使用max()而不是if,而且它不计算最长的“b”序列,而是任何字符的序列(可能在ignacio修复中出现了问题?)。无论如何,这比oneliners,IMNSHO.+1更好,它可以帮助恢复这个站点上regexp的部分价值——非常勇敢。如果“if(n-m)>1”不应该是“if(n-m)>=1”来检测长度为1的运行吗?@carlo_hamalainen——不。对检测长度为1的“运行长度”不感兴趣。