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)

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.


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)

9
oder Sie können Karte verwenden! set(map(frozenset, t))
Matt Dodge

18

Verwenden Sie nach frozensetinnen.


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!

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.