Если у меня есть aaabbbccc, я бы хотел поменять их на a3b3c3.
Я использую для этого оператор if ... но он выглядит слишком неэффективным.
Может быть, регулярное выражение было бы полезно, но возможно регулярное выражение для поиска только последовательностей?
если у меня есть aaabbbcccaaa, то я бы хотел изменить их. Список a3b3c3a3… это означает, что алгоритм выполняет поиск только «последовательных и подсчитанных» изменений в целое число.
Любой намек на продолжение работы будет оценен.
def comp(string):
index = []
for i in range(len(string)):
try:
if string[i] is not string[i+1]:
index.append(i)
except:
pass
first = string[index[0]] + str(index[0]+1)
print(first)
message_comp = [first]
for i in range(1, len(message_comp)):
message_comp.append(message[index[i]]*(index[i-1]+1))
final = ''.join(message_comp)
return final






Make an iterator that returns consecutive keys and groups from the iterable
import itertools
x = 'aaabbbcccaaa'
groups = [i + str(len([*j])) for i, j in itertools.groupby(x)]
# ['a3', 'b3', 'c3', 'a3']
join доделать:
''.join(groups)
# a3b3c3a3
При необходимости replace для удаления 1:
''.join(groups).replace('1', '') вместо ''.join(groups)
@Beverlie обновил мой ответ, просто используйте ''.join(groups).replace('1', '') в конце.
@chriz что означает [* j]?
[*j] распаковывает содержимое j (объект группировки) в список, чтобы вы могли проверить его длину.
Подробнее про распаковку тут: geeksforgeeks.org/packing-and-unpacking-arguments-in-python
Я попытался изучить ваш синтаксис i = list (itertools.groupby ('aaabb')) [0], тогда i [1] is <itertools._grouper at 0x1074ba2e8>. но если я попробую len (list (* i [1])), он вернет 0, а не 3 числа. почему так?
Может быть, itertools groupby?
from itertools import groupby
s = "aaabbbcccaaa"
groups = groupby(s)
a = [(label, sum(1 for _ in group)) for label, group in groups]
b = [i for sub in a for i in sub]
print("".join(map(str,b)))
output: a3b3c3a3
Каков самый простой способ отказаться от 1? например, для abbccc, не a1b2c3, а ab2c3