Consider a sequence of sets:
>>> [{n, 2*n} for n in range(5)]
[{0}, {1, 2}, {2, 4}, {3, 6}, {8, 4}]
Passing them directly into the union method yields the correct result:
>>> set().union({0}, {1, 2}, {2, 4}, {3, 6}, {8, 4})
{0, 1, 2, 3, 4, 6, 8}
But passing them as a list or generator expression results in a TypeError:
>>> set().union( [{n, 2*n} for n in range(5)] )
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> set().union({n, 2*n} for n in range(5))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
Why does it happen and what are some solutions?
The reason for this error is that set.union()
expects one or more sets (ie set.union(oneset, anotherset, andathirdone)
), not a list
nor generator.
The solution is to unpack your list or generator:
>>> set().union( *({n, 2*n} for n in range(5)) )
{0, 1, 2, 3, 4, 6, 8}