@Helkok

Строки и символы. Как решить задачу эту задачу?

Дико стыдно, но я просто встал в тупик.
Прохожу курс Stepic по Python. И вот уже 5-ый день бьюсь над этой задачей. Десятки вариантов перепробовал. А не выходит. А дальше идти не могу по курсу, не хочу нерешенное оставлять позади.

Вот, собственно, задача:
Узнав, что ДНК не является случайной строкой, только что поступившие в Институт биоинформатики студенты группы информатиков предложили использовать алгоритм сжатия, который сжимает повторяющиеся символы в строке.

Кодирование осуществляется следующим образом:
s = 'aaaabbсaa' преобразуется в 'a4b2с1a2', то есть группы одинаковых символов исходной строки заменяются на этот символ и количество его повторений в этой позиции строки.

Напишите программу, которая считывает строку, кодирует её предложенным алгоритмом и выводит закодированную последовательность на стандартный вывод.

Sample Input 1:
aaaabbcaa
Sample Output 1:
a4b2c1a2

Sample Input 2:
abc
Sample Output 2:
a1b1c1

А вот на данный момент более-менее мое решение. Взгляните и просто подскажите пожалуйста, готовое решение не обязательно. Первое проходит, а когда ввожу abc выводит a1b1.
line = input()
a = len(line)
x = 0
y = 1
b = line[x]
c = line[y]
g = 0
for i in range(a - 1):
    if str(c) == str(b):
        x+=1
        y+=1
        b = line[x]
        if y < a:
            c = line[y]
            g +=1
        else:
            print(b,g + 2,sep = '',end='')
    else:
        print(b,g + 1,sep = '',end='')
        x+=1
        y+=1
        b = line[x]
        if y < a:
            c = line[y]
            g = 0
  • Вопрос задан
  • 201 просмотр
Пригласить эксперта
Ответы на вопрос 2
vasilyevmn
@vasilyevmn
DevOps
s = str(input())
l = len(s)-1
c = 1
t = ''
if len(s)==1:
    t = t +s+str(c)
else:
    for i in range(0,l):
        if s[i]==s[i+1]:
            c +=1
        elif s[i]!=s[i+1]:
            t = t + s[i]+str(c)
            c = 1
    for j in range(l,l+1):
        if s[-1]==s[-2]:
            t = t +s[j]+str(c)
        elif s[-1]!=s[-2]:
            t = t +s[j]+str(c)
            c = 1
print(t)

PS
Строки и символы. Как решить задачу с курса?
Ответ написан
@o5a
Последняя буква не выводится потому, что во втором блоке (когда символ не совпадает) нет вывода для конца строки (if y < a ... else) как для первого случая. В результате если последний символ отличается от предпоследнего, ничего и не происходит.

Я бы лучше предложил вариант попроще: завести один счетчик (длины последовательности) и собственно переменную для символа. Напишу алгоритм, возможно будет интереснее написать самому.

# инициализируем 2 переменные, текущий символ (ключ), который группируем, и его счетчик
key = line[0]
cnt = 0
# в цикле проходим все символы строки
for x in line:
     # если текущий символ совпадает с ключом, увеличиваем счетчик

     # в противном случае (последовательность закончилась) печатаем наш ключ и счетчик (или вместо печати все заносим в список для вывода в самом конце)
     # также после этого устанавливаем значение ключа на текущий символ (key=x) и сбрасываем счетчик на 1
# после окончания цикла еще раз выводим текущие значения ключа и счетчика (это понадобится для случая, когда последней идет последовательность символов)


Еще для данной задачи хорошо подходит функция itertools.groupby. Она группирует одинаковые последовательности, т.е. из 'aaaabbсaa' сформирует отдельные группы по 4 'a', 2 'b', 1 'c', 2 'a'. Так что это можно использовать для решения задачи:

from itertools import groupby

line = 'aaaabbcaa'
groups = [f"{k}{len(list(g))}" for k, g in groupby(line)]
print(''.join(groups))
# a4b2c1a2
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы