@arhipT999

TypeError: unhashable type: 'list'?

Помогите пожалуйста исправить ошибку.
Код:
import telebot
import requests
from bs4 import BeautifulSoup as bs

bot = telebot.TeleBot('Token')
new = 'Первым замом Жириновского в центральном аппарате ЛДПР назначен депутат Алексей Диденко'
n = []
num = 0
new = dict()
d = {}
t = 0
y = 0
kol_vo = 0

def zapoln(message):
    global new
    global y
    global d
    global n
    if y == 1:
        d[message.chat.id] = n
    if n == []:
        bot.send_message(message.chat.id, 'Чел... ты сломал бота :( поэтому установлены стандартные настройки!')
        n = ['rian_ru', 'breakingmash']
        new = {key: None for key in n}
        rass(message)
    else:
        print(f'это{n}')
    new = {key: None for key in n}
    rass(message)

def rass(message):
        while True:
            with open('input.txt','w') as inp:
                for key,val in d.items():
                    inp.write('{}:{}\n'.format(key,val))
            global new
            global n
            global num
            global t
            global kol_vo
            kol_vo += 1
            if kol_vo == len(n):
                kol_vo = 1
            p = [i for i in n]
            url = f'https://t.me/s/{p}'
            response = requests.get(url)
            soup = bs(response.text, 'lxml')
            teg = soup.find_all('div', class_='tgme_widget_message_wrap')
            div = soup.find_all('div', class_='tgme_widget_message')
            next = soup.find_all('div', class_='tgme_widget_message_bubble')
            text_ = soup.find_all('div', class_='tgme_widget_message_text')
            s = []
            out = ''
            for i in text_:
                s.append(i)
            try:
                out = str(s[-1])
            except IndexError:
                bot.send_message(message.chat.id, 'Вы неправильно ввели какал!')
                num = 0
                t = 0
                n = []
                kanal(message)
            out = out[65:]
            out = out[:-6]
            for _ in range(out.count('<')):
                a = out.find('<')
                b = out.find('>')
                s = out[a:b+1]
                out = out.replace(s, '')
            if out == new[p]:
                pass
            else:
                new[p] = out
                bot.send_message(message.chat.id, f'{out}\n-----\nНовость от @{p}')
                print(out)

def proverka(message):
    global n
    global t
    global num
    if message.text.lower() == 'стоп' and n != []:
        num = 1
        print(n)
        zapoln(message)
    else:
        if t != 1:
            n.append(message.text)
            bot.send_message(message.chat.id, 'Напиши комманду: "/next"')

def kanal(message):
    if t != 1:
        msg = bot.send_message(message.chat.id, 'Введите название канала БЕЗ @ например: rian_ru. Если больше не хотите вводить названия напишите "Стоп"')
        bot.register_next_step_handler(msg, proverka)
    else:
        zapoln(message)

@bot.message_handler(commands='next')
def pr(message):
    global n
    if n == []:
        kanal(message)
    else:
        rass(message)

@bot.message_handler(commands='start')
def nav(message):
    global t
    global y
    global n
    with open('input.txt', 'r') as inp:
        for i in inp.readlines():
            key,val = i.strip().split(':')
            d[key] = val
            if str(message.chat.id) in d:
                n = d[str(message.chat.id)]
                print(f'n - заполняется {n}')
                t = 1
            else:
                y = 1
                d[str(message.chat.id)] = n
    pr(message)

bot.polling()

Консоль:
n - заполняется ['rian_ru']
Traceback (most recent call last):
  File "c:\Users\Student\Documents\GitHub\arhipT999.github.io\tbot.py", line 125, in <module>
    bot.polling()
  File "C:\Users\Student\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 664, in polling
    self.__threaded_polling(non_stop, interval, timeout, long_polling_timeout, allowed_updates)
  File "C:\Users\Student\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 726, in __threaded_polling
    raise e
  File "C:\Users\Student\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 686, in __threaded_polling
    self.worker_pool.raise_exceptions()
  File "C:\Users\Student\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\util.py", line 136, in raise_exceptions
    raise self.exception_info
  File "C:\Users\Student\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\util.py", line 88, in run      
    task(*args, **kwargs)
  File "c:\Users\Student\Documents\GitHub\arhipT999.github.io\tbot.py", line 123, in nav
    pr(message)
  File "c:\Users\Student\Documents\GitHub\arhipT999.github.io\tbot.py", line 105, in pr
    rass(message)
  File "c:\Users\Student\Documents\GitHub\arhipT999.github.io\tbot.py", line 72, in rass
    if out == new[p]:
TypeError: unhashable type: 'list'

Файл input.txt:
-1001682669467:['breakingmash']
5131695189:['rian_ru']
  • Вопрос задан
  • 197 просмотров
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Ну тебе довольно таки прямо сказано: списки не являются хэшируемым типом (так как они изменяемы). А потому они не могут использоваться как ключи в словаре или элементы множеств.
А у тебя:
new = dict()
p = [i for i in n]

и обращение к new[p].
Ответ написан
Комментировать
Список не может быть ключем словаря, т. к. он изменяемый.
Возможно использовать кортежи
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы