Подсчет самого длинного появления повторной последовательности в Python - PullRequest
10 голосов
/ 19 апреля 2010

Какой самый простой способ подсчитать самый длинный последовательный повтор определенного символа в строке?Например, самый длинный последовательный повтор «b» в следующей строке:

my_str = "abcdefgfaabbbffbbbbbbfgbb"

будет равен 6, поскольку другие последовательные повторы короче (3 и 2, соответственно.) Как это сделать в Python

Ответы [ 5 ]

9 голосов
/ 19 апреля 2010

Вот одна строка:

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

Пояснение:

itertools.groupby вернет группы последовательных идентичных символов вместе с итератором для всех элементов в этой группе. Для каждого такого итератора len(list(y)) даст количество элементов в группе. Взятие максимума этого (для данного персонажа) даст требуемый результат.

9 голосов
/ 19 апреля 2010

Как насчет примера регулярного выражения:

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

Edit, Mine vs. 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
5 голосов
/ 19 апреля 2010

Вот мой действительно скучный, неэффективный, простой метод подсчета (междурядье намного лучше). Обратите внимание, я написал это в этом небольшом текстовом поле, в котором нет переводчика, поэтому я не проверял его и, возможно, допустил действительно глупую ошибку, которую не уловил корректор.

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)
2 голосов
/ 19 апреля 2010

Использование кодировки длин серий:

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 
0 голосов
/ 30 апреля 2014

Вот мой код, не такой эффективный, но, кажется, работает:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...