что делать с ,буквой, которая встречается один раз при декодировании RLE

Есть функция для декодирования, но она работает только с такими строками A15B1A5

def run_length_decoding(compressed_seq):
    seq = ''
    for i in range(0, len(compressed_seq)):
        if compressed_seq[i].isalpha():
            for j in range(int(compressed_seq[i + 1])):
                seq += compressed_seq[i]

    return (seq)

Мне нужно, чтобы она работала с такими: A15BA5, где после буквы, встречающейся один раз нет цифры 1

с условиями не получается:

...
if compressed_seq[i].isalpha() and compressed_seq[i+1].isdigit():
        for j in range(int(compressed_seq[i + 1])):
            seq += compressed_seq[i]
    elif (compressed_seq[i].isalpha() and compressed_seq[i+1].isalpha()):
        seq += compressed_seq[i]
...

Ответы (1 шт):

Автор решения: GrAnd

Ваша функция даже А15 неправильно декодирует (будет только одна А а пятёрка уйдёт в небытие). Так что я не стал исправлять вашу и написал другую:

import re

def run_length_decoding(compressed_seq):
    return ''.join(symb*int(n) if n else symb for symb,n in re.findall(r'(.)(\d+)?', compressed_seq))

Или та же функция, если расписать её в вашем (более классическом многострочном) стиле:

def run_length_decoding(compressed_seq):
    seq = ''
    for symb,n in re.findall(r'(.)(\d+)?', compressed_seq):
        if n:
            for j in range(int(n)):  # вообще-то весь этот цикл можно заменить строчкой: seq += symb*int(n)
                seq += symb
        else:
            seq += symb
    return seq
→ Ссылка