#python
#python
Вопрос:
Может кто-нибудь, пожалуйста, скажите мне, почему я получаю ошибку TypeError: unhashable type: ‘list’ в инструкции print ниже? По какой-то причине ему не нравится список данных, которые я ввожу в функцию.
from random import randint
from functools import lru_cache
data = []
[data.append(randint(1,1000000)) for i in range(1,1000000)]
data = sorted(data)
low = 0
high = len(data) 1
target = randint(1,100000)
print(low, high, target)
@lru_cache(maxsize = 1000)
def binary_search(data, target, low, high):
if low > high:
return False
else:
mid = (low high) // 2
if target == data[mid]:
return True
elif target < data[mid]:
return binary_search(data, target, low, mid 1)
else:
return binary_search(data, target, mid 1, high)
print(binary_search(data, target, low, high))
Комментарии:
1. Не похоже, что эта ошибка может возникнуть из любого оператора печати. Не могли бы вы, пожалуйста, опубликовать всю информацию об ошибках и трассировке стека, которую вы получаете?
2. Обычно эта ошибка возникает, когда вы пытаетесь получить доступ к словарю, используя список в качестве ключа, вы можете использовать кортеж для ее решения
Ответ №1:
lru_cache
требуется, чтобы аргументы были хешируемыми:
In [1]: from functools import lru_cache
In [2]: @lru_cache(maxsize=1000)
...: def f(arg):
...: print(arg)
...:
In [3]: f([1,2,3])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-816cce84b257> in <module>
----> 1 f([1,2,3])
TypeError: unhashable type: 'list'
Это связано с тем, что реализация использует некоторую хэш-таблицу для эффективного поиска аргументов. list
s изменчивы и, следовательно, не могут быть хэшированы.
Если вы хотите использовать lru_cache
аргументы, они должны быть, например, tuple
s вместо list
s .
В вашем случае:
print(binary_search(tuple(data), target, low, high))
должно работать.
Комментарии:
1. Да! Это сработало. Большое спасибо, Бакуриу.