Как я могу создать набор наборов в Python?
Я пытаюсь сделать наборы наборов в 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)
4 ответа
Питон жалуется, потому что внутренний 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)
По состоянию на 2020 год в официальной документации Python рекомендуется использовать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!