Ошибка при сжимании данных из файла с помощью метода Шеннона

на вход программы поступает ,например,картинка или любой другой файл,после чего он кодируется при помощи base 64 (или чтоб не кодировать base 64 подскажите,как переводить файлы в двоичный формат),дальше сжимается при помощи алгоритма Шеннона и выскакивает такая ошибка: if key in a: TypeError: argument of type 'int' is not iterable Как можно решить данную ошибку?

import collections
from base64 import b64encode as enc64
from base64 import b64decode as dec64

file = input("Enter the filename:")
with open(file, 'rb') as f:
    message =enc64(f.read())


c = {}
def create_list(message):
    list = dict(collections.Counter(message)) #предназначен для удобных и быстрых подсчетов количества появлений неизменяемых элементов в последовательностях
    for key, value in list.items():
        print(key, ' : ', value)                         #создание отсортированного списка по вероятности
    list_sorted = sorted(iter(list.items()), key = lambda k_v:(k_v[1],k_v[0]),reverse=True)
    final_list = []
    for key,value in list_sorted:
        final_list.append([key,value,''])
    return final_list

print("Shannon tree with merged pathways:")
def divide_list(list):
    if len(list) == 2:
        print([list[0]],[list[1]])#печать объединенных путей
        return [list[0]],[list[1]]
    else:
        n = 0
        for i in list:
            n+= i[1]
        x = 0
        distance = abs(2*x - n)
        j = 0
        for i in range(len(list)):               #shannon древовидная структура
            x += list[i][1]
            if distance < abs(2*x - n):
                j = i
    print(list[0:j+1], list[j+1:])  #печать объединенных путей
    return list[0:j+1], list[j+1:]


def label_list(list):
    list1,list2 = divide_list(list)
    for i in list1:
        i[2] += '0'
        c[i[0]] = i[2]
    for i in list2:
        i[2] += '1'
        c[i[0]] = i[2]
    if len(list1)==1 and len(list2)==1:        #присвоение значений дереву
        return
    label_list(list2)
    return c

code = label_list(create_list(message))
print("Shannon's Encoded Code:")
output = open("compressed.txt","w+")          # генерирует выходной двоичный файл
letter_binary = []
for key, value in code.items():
    print(key, ' : ', value)
    letter_binary.append([key,value])
print("Compressed file generated as compressed.txt")

for a in message:
    for key, value in code.items():
        if key in a:
            print(key, ' : ', value)
            output.write(value)
output = open("compressed.txt","r")
intermediate = output.readlines()
bitstring = ""
for digit in intermediate:
    bitstring = bitstring + digit
uncompressed_string =""
code =""
for digit in bitstring:
    code = code+digit
    pos=0
    for letter in letter_binary:               # декодирование двоичного файла и генерация исходных данных
        if code ==letter[1]:
            uncompressed_string=uncompressed_string+letter_binary[pos] [0]
            code=""
        pos+=1

print("Your UNCOMPRESSED data is:")
print(uncompressed_string)

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

Автор решения: passant

Причем тут сжатие данных? Причем тут алгоритм Шеннона? Причем тут непонятная простыня кода на сотню строчек? Вам же ясно написали " if key in a: TypeError: argument of type 'int' is not iterable " При этом компилятор вам даже сказал в какой строчке это происходит, но вы не удосужились это сообщить нам. Ну так найдите эту строчку, посмотрите, где там с объектом типа int вы пытаетесь работать как с иттератором, потом посмотрите, где и как вы эту переменную определяете - и исправляйте.

Подсказка. Только потому, что вы новичек на форуме. Ошибка у вас вот в этой строке,

if key in a:

где "a" - имеет тип int. А для этого типа оператор in не определен. Измените строчку на

if key == a:

Впрочем, это не спасет вас от следующих ошибок в вашем коде. Поэтому лучше сначала изучите Python, лучше - по какой нибудь серьезной книге, а потом пробуйте запускать какие-то чужие программы. И тогда во-первых, такие простые ошибки не будут вас повергать в шок, а во вторых - наУчитесь, как надо отлаживать программы самостоятельно, а не бегая на форумы.

P.S. Посмотрел. Это не первый ваш вопрос на форуме, но столь-же элементарный. Тем более совет начать изучать Python для вас актуален.

→ Ссылка