Как я могу создать набор наборов в Python? - PullRequest
104 голосов
/ 09 мая 2011

Я пытаюсь сделать набор наборов в 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 ]

98 голосов
/ 09 мая 2011

Python жалуется, потому что внутренние set объекты являются изменяемыми и, следовательно, не могут быть хэшРешение состоит в том, чтобы использовать frozenset для внутренних наборов, чтобы указать, что вы не собираетесь изменять их.

41 голосов
/ 28 января 2014

Люди уже упоминали, что вы можете сделать это с помощью frozenset () , поэтому я просто добавлю код, как этого добиться:

Например, вы хотите создать набор множеств из следующего списка списков:

t = [[], [1, 2], [5], [1, 2, 5], [1, 2, 3, 4], [1, 2, 3, 6]]

Вы можете создать свой набор следующим образом:

t1 = set(frozenset(i) for i in t)
15 голосов
/ 09 мая 2011

Используйте frozenset внутри.

3 голосов
/ 03 декабря 2016

Итак, у меня была точно такая же проблема. Я хотел создать структуру данных, которая работает как набор множеств. Проблема состоит в том, что наборы должны содержать неизменных объектов. Итак, что вы можете сделать, это просто сделать это как набор кортежей. Это хорошо сработало для меня!

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!
...