Подсчет символов, идущих подряд, в строке

Нужно написать код, который будет считать количество одинаковых символов в строке, идущих подряд и выводить букву + количество повторений. Если символ встречается 1 раз, то в выводе не должно быть 1

Я написал код. Он работает, но не во всех случаях. Например:
Ввод: AAABBB
Вывод: A3B3
В такой ситуации мой код работает и всё хорошо.

Однако может быть такая ситуация:
Ввод: AAABBAA
Вывод, который должен быть: A3B2A2
Вывод, который дает мой код: A5B2

Вот мой код:

text = input()

li = []
li1 = []

for i in text:
    li.append(i)
    
for i in li:
    j = li.count(i)
    if j != 1:
        if i not in li1:
            li1.append(i)
            li1.append(j)
    else:
        if i not in li1:
            li1.append(i)

print(*li1, sep='')

Подскажите, пожалуйста, как исправить. Заранее спасибо.


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

Автор решения: Дмитрий Чистик

На питоне хз, но на шарпе это так, на питон думаю проблемы перевести не будет.

StringBuilder result = new StringBuilder();
char c = text[1];
int cnt=1;
for (var i=1; i<text.length; ++i)
{
  if (c!=text[i])
  {
    result.append(c.ToString() + cnt.ToString());
    c = text[i];
    cnt = 0;
  }
  ++cnt;
}
if (cnt>0)
  result.append(c.ToString() + cnt.ToString());
→ Ссылка
Автор решения: MBo
text = input() + '`'
sq = []
cnt = 1
ch = text[0]
for c in text[1:]:
    if c != ch:
        sq.append(ch)
        if cnt > 1:
            sq.append(cnt)
        ch = c
        cnt = 1
    else:
        cnt+=1
print(*sq, sep='')
→ Ссылка
Автор решения: strawdog

пользуйтесь встроенными библиотеками:

from itertools import groupby

a = "AAABBBAABABBB"

res = "".join([f"{i}{len(list(g))}" for i,g in groupby(a)])
print(res)

A3B3A2B1A1B3

Если единицы не нужно выводить, то из-за особенностей генератора groupby можно сделать так:

res = "".join([f"{x[0]}{x[1] if x[1]>1 else ''}" 
               for x in [(i, len(list(g))) for i, g in groupby(a)]])
print(res)

A3B3A2BAB3

→ Ссылка
Автор решения: SergFSM

вариант с регуляркой:

from re import sub

a = "AAABBBAABABBB"

f = lambda m: f'{m[1]}{l if (l:=len(m[0])) > 1 else ""}'
res = sub(r'(\w)\1*', f, a)

print(res)  # 'A3B3A2BAB3'
→ Ссылка
Автор решения: чистов_n

А можно вот так:

text = input()

result: str = ''

number = 0
letter = ''

for s in text:
    if not letter:
        letter = s
        number += 1
    else:
        if s != letter:
            result += letter + str(number)
            letter = s
            number = 1
        else:
            number += 1

result += letter + str(number)

print(result)
→ Ссылка
Автор решения: Anna
s=input()
s=s.replace(' ','')
s2=''
el=s[0]
k=1
for c in s[1:]:
    if el==c:
        k+=1
    else:
        s2+=el+str(k)+' '
        el=c
        k=1
s2+=el+str(k)  
print(s2)
→ Ссылка