Объединение множеств Python вызывает TypeError

Рассмотрим последовательность множеств:

>>> [{n, 2*n} for n in range(5)]
[{0}, {1, 2}, {2, 4}, {3, 6}, {8, 4}]

Передача их непосредственно в метод объединения дает правильный результат:

>>> set().union({0}, {1, 2}, {2, 4}, {3, 6}, {8, 4})
{0, 1, 2, 3, 4, 6, 8}

Но передача их как выражения списка или генератора приводит к ошибке 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'

Почему это происходит и каковы некоторые решения?

2 ответа

Решение

Причина этой ошибки в том, что set.union() ожидает один или несколько наборов (т.е. set.union(oneset, anotherset, andathirdone)), а не list ни генератор.

Решение состоит в том, чтобы распаковать ваш список или генератор:

>>> set().union( *({n, 2*n} for n in range(5)) )
{0, 1, 2, 3, 4, 6, 8}

Вот способ объединения нескольких наборов без создания списка

s = set()

for n in range(5): 
    s = s.union({n, 2*n})
Другие вопросы по тегам