Задать вопрос

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

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

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

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

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

Sample Input 1:
aaaabbcaa
Sample Output 1:
a4b2c1a2

Sample Input 2:
abc
Sample Output 2:
a1b1c1


А вот на данный момент более-менее мое решение. Знаю, что надо сравнивать со следующим элементом строки, но все перерыл, нет ничего подобного, на мою самодеятельность PyCharm дает ошибки. Взгляните и просто подскажите пожалуйста, готовое решение не обязательно.
message = "aaaabbсaa"
cnt = 1
for i in message:
    if i == message[1:-1]:
        cnt += 1
        print(i, end='')
    else:
        print(i, end='')
        print(cnt, end='')
        cnt = 1


Выводит вот это: a1a1a1a1b1b1с1a1a1
  • Вопрос задан
  • 50120 просмотров
Подписаться 2 Оценить 1 комментарий
Решения вопроса 1
@Abrashitov Автор вопроса
Ребят, всем огромное спасибо!
Дело в том, что я не могу применять функции типа compress или append, так как полагается, что мы это не знаем еще.
В общем собрал с ваших решений по капле и выдал вот этот код, который удовлетворяет решению:
message = str(input())
cnt = 1
x = 1
j = message[x:x+1]
for i in message:
    if i in j:
        cnt += 1
    else:
        print(i, end='')
        print(cnt, end='')
        cnt = 1
    x += 1
    j = message[x:x+1]


Немного корявый, но после долгих мытарств рад и этому) Что думаете?
Ответ написан
Пригласить эксперта
Ответы на вопрос 11
такое еще:
s = input()
l=len(s)
cnt=1
for i in range(l):
    if i==(l-1):
        print(s[i]+str(cnt),end='')
    else:
        if s[i]==s[i+1]:
            cnt=cnt+1
        else:
            print(s[i]+str(cnt),end='')
            cnt=1
Ответ написан
Комментировать
@vilgeforce
Раздолбай и программист
message[1:-1] - вся строка кроме первого и последнего символов. Кажется, с ней там делать ничего не нужно. Ну и вообще отладчик освойте, сильно помогает.
Ответ написан
@Alexander1705
#/usr/bin/env python3
# -*- coding: utf-8 -*-

def compress(msg):
    c_msg = ""    
    prev_char = ""
    count = 1   
    for curr_char in msg:
        if curr_char != prev_char:
            if prev_char:
                c_msg += str(count)
            c_msg += curr_char
            count = 1
        else:
            count += 1
        prev_char = curr_char

    c_msg += str(count) 
    return c_msg
Ответ написан
Комментировать
valerium
@valerium
Изобретая велосипед
Мне кажется, это тот случай, когда питоновский for бесполезен. Я бы сделал как-то так:
def compress(string)
    result = [string[0]]
    counter = 1
    i = 1
    while i < len(string) - 1:
        if string[i] == string[i-1]:
            counter += 1
        else:
            result.append(string[i-1])
            result.append(str(counter))
            counter = 1
    result.append(string[-1], counter)
    return ''.join(result)


В конце концов, должен же быть один очевидный способ сделать это ;-)

UPD: заменил конкатенацию строк на join списка. Согласно документации, так должно быть быстрее.
Ответ написан
@idbernar1561
s=input()
b=str()
s=s+'1'
c=s[0]
i=0
for r in s:
	if c!=r:
		b+=c+str(i)
		c=r
		i=0
	i+=1
print(b)
Ответ написан
@Mintormo
Еще можно так:
def compress(msg):
    len_of_msg = len(msg)
    result = ""

    if msg != "" and msg is not None:
        i = 0
        while i < len_of_msg:
            j = 0
            current_char = msg[i:i+1]
            while i < len_of_msg and msg[i] == current_char:
                i += 1
                j += 1
            result += current_char + str(j)
    return result
Ответ написан
baterson
@baterson
python/django
Еще можно решить словарем, хоть и не по теме)

dnk = 'aaaaaabbbaaccc'
dnk_dict = {}
res = ''

for i in dnk:
	if i not in dnk_dict:
		dnk_dict[i] = 1
	else:
		dnk_dict[i] += 1

for i in dnk_dict:
	res += str(i) + str(dnk_dict[i]) 
	
print(res)
Ответ написан
angru
@angru
def compress(seq):
    tmp, seq = list(seq[:1]), seq[1:]
    parts = [tmp] if tmp else []

    for ch in seq:
        if ch in tmp:
            tmp.append(ch)
        else:
            tmp = [ch]
            parts.append(tmp)

    return ''.join('{}{}'.format(part[0], len(part)) for part in parts)
Ответ написан
Комментировать
@Sergii2802
a=input()
text=''
i=1
j=1

while i < len(a):
if a[i]==a[i-1]:
j+=1
else:
text = text + a[i-1]+str(j)
j=1
i+=1
text = text + a[i-1]+str(j)
print(text)
Ответ написан
Комментировать
@Digara
У меня как то так получилось
text = input()
i = 1
s = text[0]
while i < len(text):
    if text[i] != text[i - 1]:
        s += text[i]
        i += 1
    else:
        i +=1
print(s)
Ответ написан
Комментировать
@kashapovin
I started learning python in April 2022
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)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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