Wie kann ich eine Reihe von Mengen in Python erstellen?

126

Ich versuche, eine Reihe von Mengen in Python zu erstellen. Ich kann nicht herausfinden, wie es geht.

Beginnend mit dem leeren Satz xx:

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

aber ich verstehe

TypeError: unhashable type: 'list'

oder

TypeError: unhashable type: 'set'

Ist es möglich, eine Reihe von Mengen in Python zu haben?

Ich habe es mit einer großen Sammlung von Mengen zu tun und möchte in der Lage sein, keine doppelten Mengen zu behandeln (eine Menge B von Mengen A1, A2, ...., An würde zwei Mengen "annullieren", wenn Ai = Aj)

Matt
quelle

Antworten:

120

Python beschwert sich, weil die inneren setObjekte veränderlich und daher nicht hashbar sind. Die Lösung besteht darin, frozensetfür die inneren Sätze zu verwenden, um anzuzeigen, dass Sie nicht beabsichtigen, sie zu ändern.

a3nm
quelle
59

Die Leute haben bereits erwähnt, dass Sie dies mit einem frozenset () tun können , daher werde ich nur einen Code hinzufügen, um dies zu erreichen:

Sie möchten beispielsweise eine Gruppe von Gruppen aus der folgenden Liste von Listen erstellen:

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

Sie können Ihr Set folgendermaßen erstellen:

t1 = set(frozenset(i) for i in t)
Salvador Dali
quelle
9
oder Sie können Karte verwenden! set(map(frozenset, t))
Matt Dodge
18

Verwenden Sie nach frozensetinnen.

Ignacio Vazquez-Abrams
quelle
9
Vielleicht könnten Sie ein paar Hinweise zu veränderlichen / unveränderlichen Objekten in Python geben, da er neu ist?
Seth Johnson
2
@ Seth: Ich könnte, aber Veränderlichkeit ist kein Faktor.
Ignacio Vazquez-Abrams
Vielen Dank! Ich lese gerade re: Mutability. Es scheint, als ob eine Reihe von Listen auch funktionieren könnte, aber frozenset scheint es zu schaffen. Danke noch einmal!
Matt
@Ignacio Ich dachte, dass Mitglieder in Sets und Schlüssel in Diktaten hashfähig und daher unveränderlich sein müssen.
Seth Johnson
7
Hashability und Mutability schließen sich nicht unbedingt gegenseitig aus. Es kommt einfach so vor, dass die meisten grundlegenden Python-Typen ein Muster gemeinsam haben.
Ignacio Vazquez-Abrams
3

Ich hatte also genau das gleiche Problem. Ich wollte eine Datenstruktur erstellen, die als Satz von Sätzen funktioniert. Das Problem ist, dass die Mengen unveränderliche Objekte enthalten müssen . Was Sie also tun können, ist es einfach als eine Reihe von Tupeln zu machen. Das hat bei mir gut funktioniert!

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!
tremb
quelle
22
In Tupeln ist die Elementreihenfolge wichtig. So A.add( (4,3,2)); A.add((2,4,3)); A.add((2,3,4))werden drei verschiedene Elemente hinzuzufügen, während die ursprüngliche Frage zu „Menge von Mengen“ ist, was das bedeutet (2,3,4), (4,3,2), (2,4,3)gleich sind.
Boris Gorelik
1

Ab 2020 wird in der offiziellen Python-Dokumentation empfohlen frozenset, Sätze darzustellen.

AtilioA
quelle
1
Wow, das ist sehr interessant, da PEP 416 (eingefrorenes Diktat) nicht angenommen wurde und 2012 vorgeschlagen wurde.
NikoNyrh