Задать вопрос
@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']
  • Вопрос задан
  • 326 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
Vindicar
@Vindicar
RTFM!
Ну тебе довольно таки прямо сказано: списки не являются хэшируемым типом (так как они изменяемы). А потому они не могут использоваться как ключи в словаре или элементы множеств.
А у тебя:
new = dict()
p = [i for i in n]

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

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

Похожие вопросы
от 200 000 до 300 000 ₽
Greenway Global Новосибирск
от 150 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽