«Есть ли способ получить последовательность наиболее последовательных алфавитов?» - PullRequest
2 голосов
/ 08 мая 2019

Я работаю над проблемой с питоном, в которой есть строка типа «aaabbcc» и число n (целое число). Я должен отобразить последовательность любого алфавитного символа, который появляется ровно n раз.

Я попробовал код

import collections
str1 = 'aaabbcc'
d = collections.defaultdict(int)
for c in str1:
    d[c] += 1

for c in sorted(d, key=d.get, reverse=True):
  if d[c] > 1:
      print(c, d[c])

Но я получаю вывод как

a 3
b 2
c 2

Я ожидаю вывода, поскольку целочисленный ввод 3 вводится пользователем.

integer= 3 
sequence= aaa

Есть ли альтернативное решение?

Ответы [ 3 ]

1 голос
/ 08 мая 2019

и itertools.groupby подход на основе:

from itertools import groupby

str1 = 'aaabbcc'
n = 3

for key, group in groupby(str1):
    if len(tuple(group)) == n:
        print(f'integer: {n} sequence: {n*key}')

без key groupby сгруппирует последовательность по тождеству - т.е. каждый раз, когда буква в str1 изменится, получит эту букву и ее вхождения.

1 голос
/ 08 мая 2019

Вот подход, основанный на регулярных выражениях, который, кажется, работает:

input = "ddaaabbbbbbbbccceeeeeee"
n = 3
for match in re.finditer(r'(.)(?!\1)(.)\2{' + str(n-1) + r'}(?!\2)', input):
print(match.group(0)[1:])

aaa
ccc

Шаблон регулярного выражения, используемый в приведенном выше примере, выглядит следующим образом:

(.)(?!\1)(.)\2{2}(?!\2)

Это говорит:

(.)     match and capture any single character
(?!\1)  assert that the next character is different
(.)     then match and capture that next character
\2{2}   which is then followed by that same character exactly twice (total of 3)
(?!\2)  after three instances, the character that follows is NOT the same
0 голосов
/ 08 мая 2019

подход, основанный на циклах (это должно быть довольно простым):

str1 = 'aaabbcc'
n = 3

count = 1
last = None
for char in str1:
    if last == char:
        count += 1
    else:
        if count == n:
            print(f'integer: {n} sequence: {n*last}')
        last = char
        count = 1
if count == n:
    print(f'integer: {n} sequence: {n*last}')

последний оператор if для вывода решения, если оно найдено, включая последний символ str1.

...