Unhashable type list что за ошибка
How to overcome TypeError: unhashable type: ‘list’
I’m trying to take a file that looks like this:
And use a dictionary to so that the output looks like this
This is what I’ve tried
7 Answers 7
Note: This answer does not explicitly answer the asked question. the other answers do it. Since the question is specific to a scenario and the raised exception is general, This answer points to the general case.
Hash values are just integers which are used to compare dictionary keys during a dictionary lookup quickly.
Internally, hash() method calls __hash__() method of an object which are set by default for any object.
Converting a nested list to a set
This happens because of the list inside a list which is a list which cannot be hashed. Which can be solved by converting the internal nested lists to a tuple,
Explicitly hashing a nested list
The solution to avoid this error is to restructure the list to have nested tuples instead of lists.
Also, you’re never initializing the lists in the dictionary, because of this line:
Which should actually be:
I noticed several other likely problems with the code, of which I’ll mention a few. A big one is you don’t want to (re)initialize d with d = <> for each line read in the loop. Another is it’s generally not a good idea to name variables the same as any of the built-ins types because it’ll prevent you from being able to access one of them if you need it — and it’s confusing to others who are used to the names designating one of these standard items. For that reason, you ought to rename your variable list variable something different to avoid issues like that.
Here’s a working version of your with these changes in it, I also replaced the if statement expression you used to check to see if the key was already in the dictionary and now make use of a dictionary’s setdefault() method to accomplish the same thing a little more succinctly.
Как решить ошибку “unhashable type: list” в Python
Привет гики и добро пожаловать в этой статье мы будем освещать “unhashable type: list”. Это тип ошибки, с которой мы сталкиваемся при написании кода
Как решить ошибку “unhashable type: list” в Python
Привет гики и добро пожаловать. В этой статье мы рассмотрим ошибку “unhashable type: list.” С этой ошибкой мы сталкиваемся при написании кода на Python. В этой статье наша главная цель – рассмотреть эту ошибку и устранить её. Всего этого мы добьемся на нескольких примерах. Но сначала давайте попробуем получить краткий обзор того, почему она возникает.
Словари Python принимают в качестве ключа только хэшируемые типы данных. Это означает что значения этих типов остаются неизменными в течение всего их времени жизни. Но когда мы используем тип данных list, который не является хэшируемым, мы получаем такую ошибку.
Ошибка “unhashable type: list”
В этом разделе мы рассмотрим причину, из-за которой возникает эта ошибка. Мы учтем все, что обсуждалось до сих пор. Давайте рассмотрим это на примере:
Выход:
Выше мы рассмотрели простой пример. Мы создали числовой словарь, а затем попытались распечатать его. Но вместо вывода мы получаем ошибку, потому что использовали в нем тип list в качестве ключа. В следующем разделе мы рассмотрим, как устранить эту ошибку.
Но прежде давайте рассмотрим еще один пример.
В приведенном выше примере мы сталкиваемся всё с той же проблемой. В этом словаре мы взяли в качестве данных количество государств и их рейтинг по всему миру. Теперь давайте быстро перейдем к следующему разделу и устраним эти ошибки.
Устранение ошибки “unhashable type:list”
В этом разделе мы постараемся избавиться от ошибки. Давайте начнем с первого примера. Чтобы исправить все это, мы должны использовать кортеж.
С помощью всего лишь небольшого изменения кода мы можем исправить ошибку. Здесь мы использовали кортеж, который является неизменяемым (hashable) типом данных. Аналогично мы можем исправить ошибку во втором примере.
Опять же с помощью кортежа мы можем всё исправить. Это простая ошибка, и ее легко исправить.
Разница между hashable и unhashable типами данных
В этом разделе мы видим основное различие между двумя типами. Кроме того, мы классифицируем различные типы данных, которые мы используем при кодировании на python, под этими 2 типами.
В этом разделе мы видим основное различие между двумя типами данных. Кроме того, мы классифицируем различные типы данных, которые мы используем при кодировании в Python под этими двумя типами.
Хэшируемые | Нехэшируемые |
Для этого типа данных значение остается постоянным на всем протяжении жизни объекта. | Для этого типа данных значение не является постоянным и изменяется по месту. |
Типы данных, подпадающие под эту категорию: int, float, tuple, bool, string, bytes. | Типы данных, подпадающие под эту категорию: list, set, dict, bytearray. |
Заключение
В этой статье мы рассмотрели ошибку unhashable type: list. Мы рассмотрели, почему она возникает, и методы, с помощью которых мы можем её исправить. Чтобы разобраться в этом, мы рассмотрели несколько примеров. В конце концов, мы можем сделать вывод, что эта ошибка возникает, когда мы используем нехэшируемый (изменяемый) тип данных в словаре.
Unhashable Type Python Error Explained: How To Fix It
Have you ever seen the message “TypeError: unhashable type” when running your Python program? Do you know what to do to fix it?
The message “TypeError: unhashable type” appears in a Python program when you try to use a data type that is not hashable in a place in your code that requires hashable data. For example, as an item of a set or as a key of a dictionary.
This error can occur in multiple scenarios and in this tutorial we will analyse few of them to make sure you know what to do when you see this error.
Unhashable Type ‘Dict’ Python Error
To understand when this error occurs let’s replicate it in the Python shell.
We will start from a dictionary that contains one key:
Now add a second item to the dictionary:
All good so far, but here is what happens if by mistake we use another dictionary as key:
The error unhashable type: ‘dict’ occurs because we are trying to use a dictionary as key of a dictionary item. By definition a dictionary key needs to be hashable.
When we add a new key / value pair to a dictionary, the Python interpreter generates a hash of the key. To give you an idea of how a hash looks like let’s have a look at what the hash() function returns.
You can see that we got back a hash for a string but when we tried to pass a dictionary to the hash function we got back the same “unhashable type” error we have seen before.
The unhashable type: ‘dict’ error is caused by the fact that mutable objects like dictionaries are not hashable.
Unhashable Type ‘numpy.ndarray’ Python Error
Let’s have a look at a similar error but this time for a numpy.ndarray (N-dimensional array).
After defining an array using NumPy, let’s find out what happens if we try to convert the array into a set.
We see the “unhashable type” error again, I want to confirm if once again we see the same behaviour when we try to apply the hash() function to our ndarray.
The error is exactly the same, but why are we seeing this error when converting the array into a set?
Let’s try something else…
The array we have defined before was bi-dimensional, now we will do the same test with a uni-dimensional array.
It worked this time.
The reason why the first conversion to a set has failed is that we were trying to create a set of NumPy arrays but a NumPy array is mutable and hence it cannot be used as element of a set.
The items in a set have to be hashable. Only immutable types are hashable while mutable types like NumPy arrays are not hashable because they could change and break the lookup based on the hashing algorithm.
For example, strings are immutable so an array of strings should get converted to a set without any errors:
All good. The same behaviour we have seen also applies to normal Python lists instead of NumPy arrays.
Unhashable Type ‘Slice’ Error in Python
The error unhashable type: ‘slice’ occurs if you try to use the slice operator with a data type that doesn’t support it.
For example, you can use the slice operator to get a slice of a Python list.
But what happens if you apply the slice operator to a dictionary?
The slice works on indexes and that’s why it works on lists and it doesn’t work on dictionaries.
Dictionaries are made of key-value pairs and this allows to access any value by simply using the associated dictionary key.
Unhashable Type ‘List’ in Python
Here is when you can get the unhashable type ‘list’ error in Python…
Let’s create a set of numbers:
All good so far, but what happens if one of the elements in the set is a list?
We get back the unhashable type error, and that’s because…
The items of a Python set have to be immutable but a list is mutable. This is required because the items of a set need to be hashable and a mutable data type is not hashable considering that its value can change at any time.
The tuple is similar to a list but is immutable, let’s see if we can create a set a provide a tuple instead of a list as one of its items:
No error this time.
The difference between a list and a tuple in Python is that a list is mutable, is enclosed in square brackets [ ] and is not hashable. A tuple is immutable, is enclosed in parentheses () and is hashable.
Unhashable Type ‘Set’ Python Error
It’s time to find out how you can also encounter the unhashable type error when trying to use a set as item of another set.
First of all let’s define a list of sets:
It works fine because the elements of a list can be mutable.
Now, instead of defining a list of sets we will try to define a set of sets.
Start by creating an empty set:
Then we will use the set add method to add a first item of type set to it.
We get back the error unhashable type: ‘set’ because, as explained before, the items of a set have to be immutable and hashable (e.g. strings, integers, tuples).
As a workaround we can use a different datatype provided by Python: the frozenset.
The frozenset is an immutable version of the Python set data type.
Let’s convert the item set to a frozenset:
And now add the frozenset to the empty set we have defined before:
Hash Function For Different Data Types
We have seen that the unhashable type error occurs when we use a data type that doesn’t support hashing inside a data structure that requires hashing (e.g. inside a set or as a dictionary key).
Let’s go through several Python data types to verify which ones are hashable (they provide a __hash__ method).
Mutable data types are not hashable: list, set, dictionary.
As you can see above, all three data types don’t provide the __hash__ method (None returned).
Immutable data types are hashable: string, integer, float, tuple, frozenset.
All these data types have an implementation of the __hash__ function, they are hashable.
Conclusion
We have seen several circumstances in which the unhashable type error can occur in your Python code.
Specific Python data types require hashable data, for example the items of a set have to be hashable or the keys of a Python dictionary have to be hashable.
If unhashable data is used where hashable data is required the unhashable type error is raised by the Python interpreter.
You now know how to find out the cause of the error and how to solve it potentially by replacing a Python data type that is unhashable with a data type that is hashable.
TypeError: unhashable тип: «список» при использовании встроенной функции set
у меня есть список, содержащий несколько списков его элементов
Если я использую встроенную функцию set для удаления дубликатов из этого списка, я получаю ошибку
код, который я использую-это
где TopP-это список, как, например, выше
это использование set() неправильно? Есть ли другой способ, которым я могу отсортировать список выше?
4 ответов
наборы требуют, чтобы их элементы были hashable. Из типов, определенных в Python только неизменяемые, такие как строки, числа и кортежи, не hashable. Изменяемые типы, такие как списки и dicts, не хэшируются, поскольку изменение их содержимого изменит хэш и нарушит код поиска.
Так как вы сортируете список в любом случае, просто поместите дубликат удаления после список уже отсортирован. Это легко реализовать, не увеличьте алгоритмическую сложность операции и не требуйте изменения подлист на кортежи:
наборы удалить повторяющиеся элементы. Чтобы сделать это, элемент не может измениться во время набора. Списки могут изменяться после создания и называются «изменяемыми». Вы не можете поместить изменчивые вещи в набор.
списки есть unmutable эквивалент, называемый ‘кортеж’. Вот как вы напишете фрагмент кода, который возьмет список списков, удалит дубликаты списков, а затем отсортирует его в обратном порядке.
result = sorted(set(map(tuple, my_list)), reverse=True)
дополнительное Примечание: Если кортеж содержит список, кортеж по-прежнему считается изменчивым.
Python: TypeError: unhashable type: ‘list’
Я пытаюсь взять файл, который выглядит так
И использовать словарь, чтобы вывод был похож на это
Это то что я пробовал
ОТВЕТЫ
Ответ 1
Ответ 2
Кроме того, вы никогда не инициализируете списки в словаре, из-за этой строки:
На самом деле это должно быть:
Ответ 3
Примечание. Этот ответ не дает четкого ответа на заданный вопрос. другие ответы делают это. Поскольку вопрос относится к конкретному сценарию, а возникшее исключение является общим, этот ответ указывает на общий случай.
Внутренне метод hash() вызывает метод __hash__() объекта, который устанавливается по умолчанию для любого объекта.
Преобразование вложенного списка в набор
Это происходит из-за списка внутри списка, который является списком, который не может быть хеширован. Что может быть решено путем преобразования внутренних вложенных списков в кортеж,
Явное хеширование вложенного списка
Решение этой ошибки состоит в том, чтобы реструктурировать список так, чтобы вместо списков были вложенные кортежи.
Ответ 4
Ответ 5
В дополнение к этому ваш оператор if неверен, как указано в ответе Джесси, который должен читать if k not in d или if not k in d (я предпочитаю последний).
Обратите внимание, что вы также не должны использовать list или file как имена переменных, так как вы будете маскировать встроенные функции.