One of the errors we encounter in Python is the TypeError: unhashable type: ‘set’. This error occurs when we try to use a set as a key in a dictionary or an element in a set.
In this guide, we will explore the reason behind this error, what sets are, and how to avoid this error in Python.
Primarily, in Python data types play an essential role in programming, and using the wrong data type or lack of understanding of them can result in errors.
What are Sets in Python?
A set is an unordered collection of unique elements that can be of any data type.
Additionally, sets are defined by enclosing a comma-separated list of values within curly braces { } or by using the built-in set() function.
Example of sets:
sample_set = {1, 2, 3, 'Hello ITSOURCECODE! ', (4, 5, 6)}
sample_set_2 = set([1, 2, 3, 3, 3]) # creating a set using the set() function
Before we dive into the error, we need to understand the concept of hashable and unhashable types in Python.
A hashable object is an object that has a hash value that remains the same throughout its lifetime. Basically, a hash value is an integer that is used to compare and identify objects quickly.
Particularly, Immutable data types such as numbers, strings, and tuples are hashable.
Meanwhile, mutable data types such as lists and dictionaries are unhashable.
What is Typeerror: unhashable type: ‘set’?
The TypeError: unhashable type: ‘set’ occurs when we try to use a set as a key in a dictionary or as an element in a set.
As mentioned earlier, sets are mutable objects, and therefore, they are unhashable. That’s why when we try to use a set as a key in a dictionary or as an element in a set, we get the error.
Here’s how the error occurs:
my_dict = {{1, 2}: 'value'} Here is the output:
Traceback (most recent call last):
File "C:\Users\Windows\PycharmProjects\pythonProject\main.py", line 1, in <module>
my_dict = {{1, 2}: 'value'}
TypeError: unhashable type: 'set'In the above example, we are trying to use a set as a key in a dictionary, and Python throws a TypeError because the set is unhashable.
How to fix Typeerror: unhashable type: ‘set’
Now, let’s look at three ways to fix this error Typeerror: unhashable type: ‘set’, along with an example code and the output of each solution.
Solution 1: Convert the set to a frozenset
A frozenset is an immutable version of a set, which means it can be used as a key in a dictionary or an element in another set.
You can convert a set to a frozenset using the built-in frozenset() function.
Example code:
sample_set = set([1, 2, 3])
sample_dict = {frozenset(sample_set ): 'hello'}
print(sample_dict )Output:
{frozenset({1, 2, 3}): 'hello'}In this example, we create a set called sample_set with the elements 1, 2, and 3. We then create a dictionary called sample_dict with the key as the frozenset version of my_set and the value as the string ‘hello‘.
Finally, we print sample_dict , which outputs {frozenset({1, 2, 3}): ‘hello’}.
Solution 2: Use a tuple instead of a set
Tuples are hashable in Python, which means they can be used as keys in dictionaries or elements in other sets.
We can convert a set to a tuple using the built-in tuple() function.
Example code:
sample_set = set([1, 2, 3])
sample_dict = {(tuple(sample_set )): 'hello'}
print(sample_dict )Here is the output when we run the code:
{(1, 2, 3): 'hello'}In this example, we create a set called sample_set with the elements 1, 2, and 3. We then create a dictionary called sample_dict with the key as the tuple version of sample_set and the value as the string ‘hello‘.
Finally, we print sample_dict , which outputs {(1, 2, 3): ‘hello’}.
Solution 3: Use a hashable set of frozensets
If we need to use sets as elements of other sets or values in dictionaries, we can use a set of frozensets instead.
This works because frozensets are hashable, and therefore can be used as elements in another set.
sample_set = set([1, 2, 3])
sample_frozenset = frozenset(sample_set)
sample_set_of_frozensets = set([sample_frozenset])
print(sample_set_of_frozensets)Output:
{frozenset({1, 2, 3})}In this example, we create a set called sample_set with the elements 1, 2, and 3. We then create a frozenset called sample_frozenset from sample_set.
Finally, we create a set called sample_set_of_frozensets with sample_frozenset as its only element, and print it. The output is {frozenset({1, 2, 3})}.
FAQs in Typeerror: unhashable type: ‘set’
The main difference between a set and a frozenset is that a set is mutable, meaning it can be modified, while a frozenset is immutable, meaning it cannot be modified after it is created.
Also, frozensets are hashable, while sets are not.
Conclusion
In Python, understanding the difference between hashable and unhashable types is crucial, and using an unhashable type as a key or element in a set can result in the TypeError: unhashable type: ‘set’.
To fix this error, we can convert the set into a frozenset, which is an immutable version of a set and is hashable.
We hope that this guide has helped you resolve this error and get back to coding.
If you are finding solutions to some errors you might encounter we also have Typeerror: nonetype object is not callable.
Thank you for reading!
Frequently Asked Questions
What is Python TypeError and what causes it?
TypeError is raised when an operation is applied to an object of the wrong type. Common patterns: calling a non-callable object, adding incompatible types (str + int), passing the wrong number of arguments, or accessing attributes on a NoneType. Each TypeError message names the operation and expected vs actual types, the fix is almost always to convert types explicitly (int(), str()) or fix the wrong variable assignment.
How do I quickly debug a Python TypeError?
Three steps: (1) Read the full error message, it names the exact operation and types involved. (2) Print the type of every variable in that line: print(type(var1), type(var2)). (3) Check what the function expected vs what you passed. Most TypeError fixes are 1-line type casts or fixing a variable that became None unexpectedly.
Should I catch TypeError or let it propagate?
For internal code, let TypeError propagate, it’s almost always a real bug (wrong type passed). For boundary code (parsing user input, third-party API responses), catch TypeError + ValueError together: try: parsed = int(value) except (TypeError, ValueError): parsed = 0. Catching internal TypeErrors hides bugs.
How do I prevent TypeError in production?
Three patterns: (1) Use type hints (def add(a: int, b: int) -> int) and check with mypy / pyright in CI. (2) Validate inputs at boundaries (Pydantic for FastAPI, DRF serializers for Django). (3) Default values that match expected types (return 0 not None for numeric functions). Static typing catches 80% of TypeErrors before runtime.
Where can I find more TypeError fixes?
Browse the TypeError reference hub for 220+ specific TypeError fixes. For broader Python debugging, see the Python Tutorial hub. For related error types, see ValueError and AttributeError guides.
![Typeerror unhashable type set [SOLVED]](https://itsourcecode.com/wp-content/uploads/2023/04/Typeerror-unhashable-type-set-SOLVED.png)