#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)
одно и то же.