Алгоритм следующий:
- В новый список (назовем его
letters_count
) помещаете список вида [<первая буква>, 1];
- Удаляете первую букву из строки;
- Далее в цикле по строке сравниваете, совпадает ли текущая буква с буквой в последнем списке
letters_count
;
- Если да - увеличиваете значение числа на единицу;
- В противном случае - добавляете новый список по аналогии с первым;
- преобразуете
letters_count
в строку
Безусловно, может быть более элегантное решение, но это тоже вполне рабочее.
from random import randint, choice
def encode_dna(dna:str) -> str:
if not dna:
return ''
dna_letters_list = list(dna.lower())
letters_count = []
letters_count.append([dna_letters_list[0],1])
dna_letters_list.pop(0)
for letter in dna_letters_list:
if letter == letters_count[-1][0]:
letters_count[-1][1] += 1
else:
letters_count.append([letter,1])
for count in enumerate(letters_count, start=0):
index,count = count
string = ''.join(map(str,count))
letters_count[index] = string
encoded_dna = ''.join(letters_count)
return encoded_dna
if __name__ == '__main__':
alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
for i in range(10):
dna = [choice(alphabet) for _ in range(randint(1,10))]
dna_str = ''.join(dna)
print(dna_str,'->',encode_dna(dna_str))
Вывод:
c -> c1
ffdcfbeg -> f2d1c1f1b1e1g1
fgfbebbcbb -> f1g1f1b1e1b2c1b2
ffefaedac -> f2e1f1a1e1d1a1c1
g -> g1
ecbcddf -> e1c1b1c1d2f1
b -> b1
f -> f1
ec -> e1c1
fgcgcg -> f1g1c1g1c1g1