Число Python число символов в строке - PullRequest
1 голос
/ 03 июня 2019

Ввод:

abbbbccdddaaabbbbeeff

Выход:

ab4c2d3a3b4e2f2

Я пробовал, как показано ниже,

string = 'abbbbccccd'

strList = list(string)
sum = 0

for i , s in enumerate(string):
    # print (strList[i],strList[i+1])

    if strList[i] == strList[i+1]:
        sum = sum + 1
        print(strList[i],'****',sum )

    else:
        sum = sum + 1
        print(strList[i],'****',sum )
        sum = 0

Но не удалось распечатать последний элемент из списка.

Есть ли лучший способ сделать это без использования встроенных функций?

Редактировать: я хотел понять логику печати abb4c2 .. вот почему я упомянул без каких-либо встроенных функций. Можно использовать встроенные функции, если логика понятна.

Ответы [ 3 ]

6 голосов
/ 03 июня 2019

В этих задачах всегда сохраняйте текущее состояние (текущий символ и текущий счет). Нет необходимости в индексах, более простая логика.

И, наконец, не забудьте «сбросить» данные текущего цикла, иначе вы пропустите последнюю итерацию.

Мое предложение:

s = "abbbbccdddaaabbbbeeff"

result = []

current = None
current_count = 0


for c in s:
    if current == c:
        current_count += 1
    else:
        if current_count > 1:
            result.append(str(current_count))
        current_count = 1
        current = c
        result.append(c)

# don't forget last iteration count
if current_count > 1:
    result.append(str(current_count))

print("".join(result))

печать:

ab4c2d3a3b4e2f2

Хорошо, я знаю, "".join(result) вызывает встроенную функцию, но это наиболее эффективный способ. Вы не хотите добавлять символ за символом для создания строки из списка.

Как только вы докажете, что осваиваете такие алгоритмы, используйте встроенные модули, такие как itertools.groupby, для выполнения таких задач. Это быстрее и без ошибок (или даже лучше: этот другой ответ )

2 голосов
/ 03 июня 2019

Вы можете использовать more_itertools:

from more_itertools import run_length

s = "abbbbccdddaaabbbbeeff"
result = ""
for char, num in run_length.encode(s):
    result += f"{char}{num if num != 1 else ''}"
print(result) #returns ab4c2d3a3b4e2f2

РЕДАКТИРОВАТЬ: пропустили часть о встроенных функциях.Это использует внешнюю библиотеку.Оставляя это здесь, потому что я нахожу начальную проблему очень интересной.

0 голосов
/ 03 июня 2019

Вы можете использовать словари

a='abbbbccdddaaabbbbeeff'
d=dict()
for i in a:
      if i not in d:d[i]=1
      else:d[i]+=1
for key,value in d.items():
    print(key,value,sep='',end='')

вывод a4b8c2d3e2f2

...