Как я могу создать набор наборов в Python?

#python #collections #nested #set

#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)

Ответ №1:

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

 xx = set([])
# Nested sets must be frozen
elements = frozenset([2,3,4])
xx.add(elements)
  

Ответ №2:

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

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

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

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

 t1 = set(frozenset(i) for i in t)
  

Комментарии:

1. или вы можете использовать map! set(map(frozenset, t))

Ответ №3:

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

Комментарии:

1. Возможно, вы могли бы дать несколько советов об изменяемых / неизменяемых объектах в Python, поскольку он новый?

2. @Seth: Я мог бы, но изменчивость не является фактором.

3. Большое спасибо! Сейчас просто читаю re: mutability. Похоже, что набор списков также может работать, но frozenset, похоже, справляется с этим. Еще раз спасибо!

4. @Ignacio Я думал, что элементы в наборах и ключи в dicts должны быть хэшируемыми и, следовательно, неизменяемыми.

5. Хешируемость и изменяемость не обязательно являются взаимоисключающими. Так уж получилось, что большинство базовых типов Python имеют общий шаблон.

Ответ №4:

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

 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!
  

Комментарии:

1. В кортежах порядок элементов имеет значение. Таким образом, A.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4)) будут добавлены три разных элемента, в то время как исходный вопрос касается «набора наборов», что подразумевает, что (2,3,4) , (4,3,2) (2,4,3) одно и то же.