Python, как не требовать дополнительного места в конце списка? - PullRequest
0 голосов
/ 26 сентября 2018

Я написал программу, которая может сжимать последовательность символов.

def compress(string):
    output = ""
    counter = 1
    firstLoop = True

    for element in range(0, len(string)):
        # if statement checking if current character was last character
        if string[element] == string[element - 1]:
            # if it was, then the character has been written more than one
            # time in a row, so increase counter
            counter = counter + 1
        else:
            # when we detect a new character reset the counter
            # and also record the character and how many times it was repeated
            if not firstLoop:
                output = output + string[element - 1] + str(counter)
        counter = 1

        firstLoop = False
    return output

data = "aaaabbbchhtttttttf"
print(data)

compressedData = compress(data)
print(compressedData)

Программа выводит:

aaaabbbchhtttttttf
a4b3c1h2t7

Таким образом, он обнаруживает, что есть «4» записи'a', поэтому он записывает 'a4', затем 'b3' для трех записей из b.

Проблема в том, что он забывает о 'f1' в конце строки.Я знаю, что это из-за строки:

output = output + string[element - 1] + str(counter)

Так как строка [элемент-1] относится к позиции в строке перед текущим элементом, таким образом, она никогда не достигнет конечной позиции, где 'е 'есть.Программа не работает без '-1', так как она не пишет правильное письмо.

Как я могу обойти эту проблему и включить в нее f?

правильный вывод должен быть a4b3c1h2t7f1.

Спасибо:)

Редактировать: я забыл упомянуть, что программа работает, если я добавляю дополнительный символ после 'f', например, просто пробел.Но это, конечно, потому что последний символ в моей строке - это просто пробел, а не буква.

Ответы [ 5 ]

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

В духе исправления вашего кода вам просто нужно было просто добавить сначала элемент для вывода перед добавлением счетчика изменений.Вы можете использовать аккуратное обращение с именем else с циклами for, которые будут выполняться в конце, что добавит окончательный счетчик к f.Не нужно буферизовать или импортировать что-то особенное, вы были довольно близко:

def compress(string):
    output = ""
    counter = 0
    firstLoop = True

    for i in range(len(string)):
        # if statement checking if current character was last character
        if firstLoop:
            counter += 1
            output += string[i]
        else:
            if string[i] == string[i - 1]:
                counter += 1
            else:                
                output += str(counter) + string[i]
                counter = 1
        firstLoop = False      
    else:
        output += str(counter)
    return output

data = "aaaabbbchhtttttttf"
print(data)

compressedData = compress(data)
print(compressedData)
0 голосов
/ 26 сентября 2018
def compress(string):
output = ""
counter = 1

for element in range(1, len(string)):
    # if statement checking if current character was last character
    if string[element] == string[element - 1]:
        # if it was, then the character has been written more than one
        # time in a row, so increase counter
        counter = counter + 1
    else:
        # when we detect a new character reset the counter
        # and also record the character and how many times it was repeated
        output = output + string[element - 1] + str(counter)
        counter = 1

return output + string[-1] + str(counter)

Также обратите внимание, что вам нужно начать считать форму 1, а не 0 и избавиться от firstLoop

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

Попробуйте изменить цикл на for element in range(0, len(string) + 1) и добавить дополнительное условие if:

for element in range(0, len(string) + 1):
    if element == len(string):
        output = output + string[element-1] + str(counter)
    # if statement checking if current character was last character
    elif string[element] == string[element - 1]: ...
0 голосов
/ 26 сентября 2018

Вы можете сделать это проще и добавить символ в конце:

def compress(string):
    output = ""
    counter = 0
    string = string + '|'
    for element in range(0, len(string)):
        # if statement checking if current character was last character
        if string[element] == string[element - 1]:
            # if it was, then the character has been written more than one
            # time in a row, so increase counter
            counter = counter + 1
        elif element != len(string):
            output = output + string[element - 1] + str(counter)
            counter = 1
    return output[2:]

data = "aaaabbbchhtttttttf"
print(data)

compressedData = compress(data)
print(compressedData)
0 голосов
/ 26 сентября 2018

Вы можете сделать все это с itertools.groupby и sum и избежать подсчета и отслеживания индексов:

from itertools import groupby

def compress(string):
    return ''.join(k + str(sum(1 for _ in g)) for k, g in groupby(string))

>>> compress("aaaabbbchhtttttttf")
'a4b3c1h2t7f1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...