Ответ 1
Python жалуется, потому что внутренние объекты set
изменяемы и, следовательно, не хешируются. Решение состоит в том, чтобы использовать frozenset
для внутренних наборов, чтобы указать, что вы не намерены их модифицировать.
Я пытаюсь создать набор наборов в Python. Я не могу понять, как это сделать.
Начиная с пустого набора xx
:
xx = set([])
# Now we have some other set, for example
elements = set([2,3,4])
xx.add(elements)
но я получаю
TypeError: unhashable type: 'list'
или
TypeError: unhashable type: 'set'
Возможно ли иметь набор множеств в Python?
Я имею дело с большим набором наборов, и я хочу иметь возможность не иметь дело с дублирующими наборами (множество B множеств A1, A2,...., An "отменит" два набора, если Ai = Aj)
Python жалуется, потому что внутренние объекты set
изменяемы и, следовательно, не хешируются. Решение состоит в том, чтобы использовать frozenset
для внутренних наборов, чтобы указать, что вы не намерены их модифицировать.
Люди уже упомянули, что вы можете сделать это с помощью frozenset(), поэтому я просто добавлю код, как это сделать:
Например, вы хотите создать набор наборов из следующего списка списков:
t = [[], [1, 2], [5], [1, 2, 5], [1, 2, 3, 4], [1, 2, 3, 6]]
вы можете создать свой набор следующим образом:
t1 = set(frozenset(i) for i in t)
Используйте frozenset
внутри.
Итак, у меня была такая же проблема. Я хотел создать структуру данных, которая работает как набор множеств. Проблема в том, что множества должны содержать неизменяемые объекты. Итак, вы можете просто сделать это как набор кортежей. Это сработало для меня!
A = set()
A.add( (2,3,4) )##adds the element
A.add( (2,3,4) )##does not add the same element
A.add( (2,3,5) )##adds the element, because it is different!