Come posso creare un set di set in Python?


126

Sto cercando di creare un set di set in Python. Non riesco a capire come farlo.

A partire dal set vuoto xx:

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

ma capisco

TypeError: unhashable type: 'list'

o

TypeError: unhashable type: 'set'

È possibile avere un set di set in Python?

Ho a che fare con una vasta collezione di set e voglio essere in grado di non dover gestire set duplicati (un set B di set A1, A2, ...., An "annullerebbe" due set se Ai = Aj)

Risposte:


120

Python si lamenta perché gli setoggetti interni sono mutabili e quindi non irritabili. La soluzione è usare frozensetper gli insiemi interni, per indicare che non hai intenzione di modificarli.


59

Le persone hanno già detto che puoi farlo con un frozenset () , quindi aggiungerò un codice su come raggiungere questo obiettivo:

Ad esempio, si desidera creare un set di set dal seguente elenco di elenchi:

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

puoi creare il tuo set nel modo seguente:

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

9
oppure puoi usare la mappa! set(map(frozenset, t))
Matt Dodge,

18

Usa frozensetdentro.


9
Forse potresti dare alcuni suggerimenti su oggetti mutabili / immutabili in Python da quando è nuovo?
Seth Johnson,

2
@Seth: potrei, ma la mutabilità non è un fattore.
Ignacio Vazquez-Abrams,

Grazie mille! Sto solo leggendo re: mutability ora. Sembra che anche una serie di elenchi possa funzionare, ma frozenset sembra averlo fatto. Grazie ancora!
Matt

@Ignacio Pensavo che i membri in set e chiavi in ​​dicts dovessero essere hash-grado e quindi immutabili.
Seth Johnson,

7
Hashability e mutability non si escludono necessariamente a vicenda. Accade solo che la maggior parte dei tipi base di Python condividono un modello.
Ignacio Vazquez-Abrams,

3

Quindi ho avuto lo stesso identico problema. Volevo creare una struttura di dati che funzioni come un insieme di insiemi. Il problema è che gli insiemi devono contenere oggetti immutabili . Quindi, quello che puoi fare è semplicemente farlo come una serie di tuple. Per me ha funzionato benissimo!

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!

22
In tuple, l'ordine degli elementi conta. Così A.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4))aggiungerà tre elementi distinti, mentre la domanda originale è su "insieme di insiemi", il che implica che (2,3,4), (4,3,2), (2,4,3)sono gli stessi.
Boris Gorelik,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.