2011-05-09 18 views
75

Estoy tratando de hacer un conjunto de conjuntos en Python. No puedo entender cómo hacerlo.¿Cómo puedo crear un conjunto de conjuntos en Python?

Comenzando con el conjunto vacío xx:

xx = set([]) 
# Now we have some other set, for example 
elements = set([2,3,4]) 
xx.add(elements) 

pero consigo

TypeError: unhashable type: 'list' 

o

TypeError: unhashable type: 'set' 

¿Es posible tener un conjunto de conjuntos en Python?

Estoy tratando con una gran colección de conjuntos y quiero poder no tener que repartir conjuntos duplicados (un conjunto B de conjuntos A1, A2, ...., An sería "cancelar" dos conjuntos si Ai = Aj)

Respuesta

15

uso frozenset interior.

+7

Quizás podría dar algunos consejos sobre objetos mutables/inmutables en Python, ya que es nuevo? –

+2

@Seth: podría, pero la mutabilidad no es un factor. –

+0

Muchas gracias! Solo leyendo re: mutabilidad ahora. Parece que un conjunto de listas también puede funcionar, pero parece que frozenset lo hace. ¡Gracias de nuevo! – Matt

74

quejándose de Python porque los interiores set objetos son mutables y por lo tanto no hashable. La solución es usar frozenset para los conjuntos internos, para indicar que no tiene intención de modificarlos.

28

La gente ya se ha mencionado que se puede hacer esto con un frozenset(), así que sólo voy a añadir un código cómo lograr esto:

Por ejemplo, usted desea crear un conjunto de conjuntos de la siguiente lista de listas:

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

puede crear su conjunto de la siguiente manera:

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

o puede usar el mapa! 'set (map (frozenset, t))' –

3

así que tenía el mismo problema. Quería hacer una estructura de datos que funcionara como un conjunto de conjuntos. El problema es que los conjuntos deben contener objetos inmutables. Entonces, lo que puedes hacer es simplemente hacerlo como un conjunto de tuplas. ¡Eso funcionó bien para mí!

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! 
+5

En tuplas, el orden de los elementos es importante. Por lo tanto, 'A.add ((4,3,2)); A.add ((2,4,3)); A.add ((2,3,4)) 'agregará tres elementos distintos, mientras que la pregunta original es sobre" conjunto de conjuntos ", lo que implica que' (2,3,4) ',' (4,3, 2) ',' (2,4,3) 'son lo mismo. –

Cuestiones relacionadas