web-dev-qa-db-fra.com

Comment puis-je créer un ensemble d'ensembles en Python?

J'essaie de créer un ensemble d'ensembles en Python. Je ne sais pas comment faire.

En commençant par l'ensemble vide xx:

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

mais je reçois

TypeError: unhashable type: 'list'

ou

TypeError: unhashable type: 'set'

Est-il possible d'avoir un ensemble d'ensembles en Python?

J'ai affaire à une grande collection d'ensembles et je veux pouvoir ne pas avoir à traiter d'ensembles en double (un ensemble B d'ensembles A1, A2, ...., An "annulerait" deux ensembles si Ai = Aj)

104
Matt

Python se plaint parce que les objets intérieurs set sont mutables et donc non hachables. La solution consiste à utiliser frozenset pour les ensembles internes, pour indiquer que vous n'avez pas l'intention de les modifier.

100
a3nm

Les gens ont déjà mentionné que vous pouvez le faire avec un frozenset () , donc je vais simplement ajouter un code pour y parvenir:

Par exemple, vous souhaitez créer un ensemble d'ensembles à partir de la liste de listes suivante:

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

vous pouvez créer votre set de la manière suivante:

t1 = set(frozenset(i) for i in t)
43
Salvador Dali

Utilisez frozenset à l'intérieur.

J'ai donc eu exactement le même problème. Je voulais créer une structure de données qui fonctionne comme un ensemble d'ensembles. Le problème est que les ensembles doivent contenir des objets immuables. Donc, ce que vous pouvez faire, c'est simplement en faire un ensemble de tuples. Cela a bien fonctionné pour moi!

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!
4
tremb