Кодировка Лемпель Зив |У объекта Str нет атрибута «pop» - PullRequest
0 голосов
/ 26 июня 2018
from io import StringIO
def compress(uncompressed): 
    dict_size = 256
    dictionary = dict((chr(i), i) for i in range(dict_size))

    w = ""
    result = []
    for c in uncompressed:
        wc = w + c
        if wc in dictionary:
            w = wc
        else:
            result.append(dictionary[w])
            dictionary[wc] = dict_size
            dict_size += 1
            w = c

    if w:
        result.append(dictionary[w])
    return result


def decompress(compressed):
    from io import StringIO 
    dict_size = 256
    dictionary = dict((i, chr(i)) for i in range(dict_size))

    result = StringIO()
    w = chr(compressed.pop(0))
    result.write(w)
    for k in compressed:
        if k in dictionary:
            entry = dictionary[k]
        elif k == dict_size:
            entry = w + w[0]
        else:
            raise ValueError('Bad compressed k: %s' % k)
        result.write(entry)

        dictionary[dict_size] = w + entry[0]
        dict_size += 1

        w = entry
    return result.getvalue()

while True:
    choice = int(input("Would you like to compress or decompress?: "))
    if choice == 1:  
        phrase = input("Enter the phrase you would like to be compressed: ")
        compressed = compress(phrase)
        print (compressed)
    elif choice == 2:
        phrase = input("Enter the phrase you would like to be decompressed: ")
        decompressed = decompress(phrase)
        print (decompressed)

Я не знаю, правильно ли я это делаю, так что извините, это мой первый пост.

Этот код предназначен для использования метода кодирования lempel ziv для сжатия данных строк, когда пользователь вводит данные, они сжимаются без проблем, но когда программе предлагается распаковать, они ломаются.

1 Ответ

0 голосов
/ 26 июня 2018

pop() - это метод для класса list, а не str, поэтому вы можете привести его к списку следующим образом:

w = chr(list(compressed).pop(0))
...