Подсчет вхождений char в строку - PullRequest
0 голосов
/ 23 сентября 2018

Эй, ребята, я пытаюсь получить вывод a4b2c1a2d3 с вводом aaaabbcaaddd.Я думаю, что проблема с моим кодом ниже состоит в том, как я реализую счетчик для предыдущего.Есть ли проблема с index > 0:?

string1 = "aaaabbcaaddd" 
previous = ""
finalstr = ""
finalint = 1
for index, val in enumerate(string1):
    if index > 0:
        previous = string1[index - 1]
        if previous == val:
            finalint += 1
        else:
            finalstr += previous + str(finalint)
            finalint = 1
print(finalstr)

#outputs "a4b2c1a2"

Ответы [ 5 ]

0 голосов
/ 23 сентября 2018

Это называется "кодированием по длине прогона".В библиотеке Python more-itertools есть функция, которая выполняет эту кодировку:

>>> from more_itertools import run_length
... 
... string1 = "aaaabbcaaddd"
... list(run_length.encode(string1))
[('a', 4), ('b', 2), ('c', 1), ('a', 2), ('d', 3)]

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

>>> list(flatten(run_length.encode(string1)))
['a', 4, 'b', 2, 'c', 1, 'a', 2, 'd', 3]

>>> list(map(str, flatten(run_length.encode(string1))))
['a', '4', 'b', '2', 'c', '1', 'a', '2', 'd', '3']

>>> ''.join(map(str, flatten(run_length.encode(string1))))
'a4b2c1a2d3'
0 голосов
/ 23 сентября 2018

Вы можете сделать то же самое, используя itertools groupby.

from itertools import groupby
string1 = 'aaaabbcaaddd'
result = [[k, len(list(g))] for k, g in groupby(string1)]
final = "".join([i[0]+str(i[1]) for i in result])
final 

output: #'a4b2c1a2d3'
0 голосов
/ 23 сентября 2018

Если кому-то было интересно узнать о решении, к которому я обратился (основываясь на помощи DYZ)

string1 = "aaaabbcaaddd" 
finalstr = ""
previous = ""
finalint = 0
for c, v in enumerate(string1):
    if c > 0:
        previous = string1[c - 1]
        if previous == v:
            finalint += 1
        else:
            finalstr += previous + str((finalint) if finalint > 1 else '')
            finalint = 1
finalstr += previous + str((finalint) if finalint > 1 else '')
print(finalstr)
#outputs a3b2ca2d3
0 голосов
/ 23 сентября 2018
from itertools import groupby
string1 = "aaaabbcaaddd"
string2 = ''
for c, g in groupby(string1):
    string2 += '%s%d'%(c, len(list(g)))
0 голосов
/ 23 сентября 2018

Как я уже сказал в комментарии, вы забыли добавить последний счет после цикла:

finalstr += previous + str(finalint)

Однако, если вы не делаете это как назначенную домашнюю работу, естьгораздо более компактный способ решения проблемы:

from itertools import groupby
''.join(char + str(len(list(group))) for char,group in groupby(string1))
#'a4b2c1a2d3'

Ваш собственный код может быть переписан без индексов (они всегда вызывают проблемы):

cnt = 1
finalstr = ''
for x,y in zip(string1, string1[1:]):
    if x==y:
        cnt += 1
    else:
        finalstr += x + (str(cnt) if cnt > 1 else '')
        cnt = 1
finalstr += x + (str(cnt) if cnt > 1 else '')
finalstr
#'a4b2ca2d3'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...