Datentyp-Hierarchie (Wiederholung)
Zu Deiner besseren Orientierung zeige ich hier nochmals die Datentyp-Hierarchie von Python.
Mengen
Eine Menge (set
) ist eine ungeordnete Sammlung von Elementen, in der jedes Element nur einmalig vorhanden ist. Mehrfaches Hinzufügen eines Elementes ändert also nichts an einer Menge. In Python gibt es den Datentyp set
für veränderliche Mengen und frozenset
für unveränderliche Mengen.
Veränderliche Mengen werden mittels geschweifter Klammern notiert. Eine Verwechslung mit Dictionaries ist dabei ausgeschlossen. Für unveränderliche Mengen existiert kein Literal. Ebenso gibt es kein Literal für eine leere veränderliche Menge. Es entspräche in seiner Notation einem leeren Dictionary, weshalb das so eben nicht möglich ist.
>>> m1 = set() # leere Menge >>> m1 set() >>> m2 = frozenset() # dto., aber unveränderlich >>> m2 frozenset()
Die Elemente von Mengen sind nicht beliebig. Sie müssen von unveränderlichen Datentypen sein. Das hat auch Auswirkungen auf das Schachteln von Mengen. Nur unveränderliche Mengen können als Elemente einer anderen Menge vorkommen.
>>> m1 = {1, 2, 3, 3, 3, 4} # jedes Element ist einzigartig >>> m1 {1, 2, 3, 4} >>> m2 = frozenset([1, 2, 3]) # Liste nach Frozenset >>> m2 frozenset({1, 2, 3}) >>> m3 = {frozenset(m1), m2} >>> m3 {frozenset({1, 2, 3}), frozenset({1, 2, 3, 4})}
Bei der Erzeugung einer unveränderlichen Menge, sind die Elemente nicht direkt aufzählbar. Sie müssen vielmehr als Elemente eines iterierbaren Objekts übergeben werden, einem Objekt, welches elementweise durchlaufen werden kann. Listen und/oder Tupel bieten sich an.
Mit einer Set Comprehension kann wieder die verkürzte, an die Mathematik angelehnte, Notation gewählt werden, die Du bereits von Listen und Dictionaries kennst.
>>> q = {i**2 for i in range(11)} # Quadratzahlen für 0 bis 10 >>> q {0, 1, 64, 4, 36, 100, 9, 16, 49, 81, 25}Die Reihenfolge der Elemente ist nicht determiniert. Das ist am obigen Beispiel gut erkennbar. Das Unpacking ist freilich auch für Mengen definiert.
>>> q = {i**2 for i in range(11)} # Quadratzahlen für 0 bis 10 >>> q2 = {*q} >>> q2 {0, 1, 64, 4, 36, 100, 9, 16, 49, 81, 25}
Auf Mengen sind die üblichen Operationen definiert, die Du im schulischen Mathematikunterricht gelernt hast. Das Stichwort lautet Mengenlehre.
Die Operatoren unterscheiden sich hinsichtlich ihrer Schreibweise deutlich von dem, was Du in der Schule gelernt hast. Ihre Semantik ist dennoch leicht verständlich. Insbesondere lassen sie sich aber über eine handelsübliche Tastatur eingeben.
Operation | Beschreibung |
---|---|
len(s) |
Anzahl der Elemente in s |
x in s |
True , wenn x in s etnhahlten ist, sonst False |
x not in s |
True , wenn x nicht in s enthahlten ist, sonst False |
s <= t |
True , wenn s eine Teilmenge von t ist, sonst False |
s < t/code> oder |
code>True, wenn s eine echte Teilmenge von t ist, sonst False |
s >= t |
code>True, wenn s eine Obermenge von t ist, sonst False |
s > t |
code>True, wenn s eine echte Obermenge von t ist, sonst False |
s | t |
Vereinigungsmenge von s und t |
s & t |
Schnittmenge von s und t |
s - t |
Differenzmenge von s und t |
s ^ t |
symmetrische Differenzmenge von s und t |
Für ausgewählte Operatoren existieren im Rahmen von Zuweisungen Kurzschreibweisen.
Operation | Beschreibung |
---|---|
s |= t |
s = s | t |
s &= t |
s = s & t |
s -= t |
s = s - t |
s ^= t |
s = s ^ t |
Mengen besitzen, ebenso wie Zeichenketten, Listen oder Dictionaries, Methoden. Die auf Mengen definierten Methoden sind zumeist wörtlich ausgeschriebene Aufrufe für Operationen, die Du auch mithilfe der vorgestellten Operatoren formulieren kannst.
Der Vollständigkeit halber, möchte ich diese Methoden kurz nennen. Sie gelten für veränderliche wie auch unveränderliche Mengen.
Operation | Beschreibung |
---|---|
s.issubset(t) |
s = s <= t |
s.issuperset(t) |
s >= t |
s.isdisjoint(t) |
Prüfung auf Disjunktheit; True , wenn Schnittmenge leer |
s.union(t) |
s | t |
s.intersection(t) |
s & t |
s.difference(t) |
s - t/code> |
s.symmetric_difference(t) |
s ^ t |
s.copy() |
Kopie von s |
Zusätzliche Methoden für veränderliche Mengen, die nicht für den Datentyp \verb|frozenset| gelten, sind:
Operation | Beschreibung |
---|---|
s.add(e) |
Element e/code> zu |
s.clear() |
alle Elemente aus s entfernen |
s.difference_update(t) |
s -= t |
s.discard(e) |
e aus s entfernen |
s.intersection_update(t) |
s &= t |
s.remove(e) |
e aus s entfernen |
s.symmetric_difference_update(t) |
s ^= t |
s.update(t) |
s |= t |