Mengen¶
Grundlegendes¶
Genau wie in der Mathematik gibt es in Python auch den Datentyp set, auf Deutsch Menge. Ein set bzw. Menge ist eine nicht geordnete Ansammlung von Objekten mit der Einschränkung, dass ein Objekt auch nur einmal vorkommen darf. Dadurch können z.B. aus einer Liste von Teilnehmern an einer Prüfung die doppelten Anmeldungen herausgefiltert werden.
Mathematische Mengenoperationen¶
Die set Objekte erlauben insbesondere mathematische Mengenoperationen wie Vereinigungsmenge, Schnittmenge, Differenzmenge und Symmetrische Differenzmenge. Hierzu ein kurzer Rückblick auf die mathematischen Mengenoperationen.
Vereinigungsmenge¶
Die Vereinigungsmenge ist die Menge der Elemente, die in mindestens einer der zu untersuchenden Mengen enthalten sind.
Vereinigungsmenge
Schnittmenge¶
Die Schnittmenge ist die Menge der Elemente, die in allen zu untersuchenden Mengen enthalten sind.
Schnittmenge
Differenzmenge¶
Die Differenzmenge zweier Mengen ist die Menge der Elemente, die in der einen Menge, aber nicht in der anderen Menge enthalten sind.
Differenzmenge
Symmetrische Differenzmenge¶
Es handelt sich um die Menge aller Elemente, die jeweils in einer, aber nicht in beiden Mengen liegen
Symmetrische Differenzmenge
Syntax¶
Geschweifte Klammern¶
Ein set wird durch geschweifte Klammern erzeugt. Ein set darf keine veränderlichen Datentypen, wie Listen oder Dictionaries enthalten.
obstkorb = {'Apfel', 'Orange', 'Apfel', 'Pfirsich', 'Orange', 'Banane'}
print(obstkorb)
{'Apfel', 'Orange', 'Pfirsich', 'Banane'}
%%Mooc MultipleChoiceAssessment
Set als Menge
Es ist folgender Code gegeben:
nusskorb = {'Mandel', 'Cashewnuss', 'Erdnuss', 'Haselnuss', 'Walnuss', 'Mandel', 'Erdnuss', 'Paranuss', 'Walnuss', 'Erdnuss'}
print(nusskorb)
Welches Ergebnis wird in der Print-Ausgabe angezeigt?
Funktion set()¶
Die Funktion set() erzeugt ebenfalls ein set und ist auch die einzige Möglichkeit ein leeres set zu erzeugen. Ein Paar geschweifter Klammern {} ohne Inhalt erzeugt dagegen kein leeres set sondern ein leeres Dictionary (s. nächstes Unterkapitel). Eine Zeichenkette oder eine Liste als Argument für die set()-Funktion wird dabei in seine Elemente aufgespaltet, eine Zeichenkette daher in seine Zeichen und eine Liste in seine Listenelemente.
a = set('abracadabra')
print(a)
{'r', 'b', 'a', 'c', 'd'}
b = set(['Mehrere','Worte','in','einer','Liste','sind','in','der','Menge','nicht','mehr','geordnet'])
print(b)
{'Liste', 'Menge', 'Mehrere', 'sind', 'der', 'nicht', 'einer', 'Worte', 'geordnet', 'in', 'mehr'}
%%Mooc StringAssessment
Leeres Set
Wie wird ein leeres set angelegt ? Geben sie den entsprechenden Code an.
Set Comprehension¶
Ähnlich wie bei der List Comprehensions gibt es auch eine Set Comprehension
a = {x for x in 'abracadabra' if x not in 'abc'}
print(a)
{'d', 'r'}
Veranschaulichen kann man sich dies wieder, in dem die Set Comprehension in die analogen Schleifen und Bedingungen aufgespalten wird. Dabei wird ein neues Element zu einer Menge hinzugefügt und nicht - wie bei einer Liste - angehängt. D.h. es gibt keine Methode append sondern die Methode add.
b = set()
for x in 'abracadabra':
print(x,end='')
if x not in 'abc':
b.add(x)
print(" -> wird genommen")
else:
print()
print(b)
a b r -> wird genommen a c a d -> wird genommen a b r -> wird genommen a {'d', 'r'}
Set-Methoden¶
in-Operator¶
Die Abfrage, ob ein Element in einem set enthalten ist, wird wie auch bei anderen Objekten mit dem in-Operator durchgeführt.
print('Orange' in obstkorb)
True
print('Kirsche' in obstkorb)
False
Weitere Methoden¶
Folgende weitere Methoden sind für set sinnvoll
set.isdisjoint(other)
Gibt wahr (True) zurück, wenn in der Menge set keine mit der Menge other gemeinsamen Elemente enthalten sind. Mengen sind disjunkt (disjoint), genau dann wenn ihre Schnittmenge die leere Menge ist.
set.issubset(other) oder set <= other
Gibt wahr (True) zurück, wenn jedes Element in der Menge set auch in der Menge other enthalten ist. set ist damit eine Teilmenge von other
set < other
Gibt wahr (True) zurück, wenn die Menge set eine echte Teilmenge der Menge other ist. Echte Teilmenge bedeutet, dass set <= other und set != other ist, also other mindestens 1 Element mehr als set enthält.
set.issuperset(other) oder set >= other
Gibt wahr (True) zurück, wenn jedes Element in der Menge other auch in der Menge set enthalten ist.
set > other
Gibt wahr (True) zurück, wenn die Menge set eine echte Obermenge der Menge other ist. Echte Obermenge bedeutet, dass set >= other und set != other ist, also set mindestens 1 Element mehr als other enthält.
set.union(*others) oder set | other | ...
Gibt die Vereinigung aller Elemente aus der Menge set und allen anderen Mengen others als neue Menge zurück.
Vereinigungsmenge
set.intersection(*others) oder set & other & ...
Gibt die Schnittmenge aller Elemente aus der Menge set und allen anderen Mengen others als neue Menge zurück.
Schnittmenge
set.difference(*others) oder set - other - ...
Gibt die Menge aller Elemente aus der Menge set zurück, die nicht in allen anderen Mengen others enthalten sind, als neue Menge zurück.
Differenzmenge
set.symmetric_difference(other) oder set ^ other
Gibt eine neue Menge zurück mit den Elementen die entweder in der Menge set oder in der Menge other aber nicht in beiden enthalten sind.
Symmetrische Differenzmenge
copy()
Gibt eine neue Menge mit einer flachen Kopie aller Elemente zurück.
set.add(elem)
Fügt ein Element der Menge hinzu.
set.remove(elem)
Entfernt das Element elem aus der Menge. Wenn das Element elem nicht in der Menge enthalten ist, wird ein KeyError als Fehler geworfen.
set.discard(elem)
Entfernt das Element elem aus der Menge, falls das Element elem in der Menge vorhanden ist.
set.pop()
Entfernt ein beliebiges Element aus der Menge und gibt dieses zurück. Wenn die Menge leer ist, wird ein KeyError als Fehler geworfen.
set.clear()
Entfernt alle Elemente aus der Menge.
Mengen-Operationen¶
a = set('abracadabra')
print(a)
b = set('alacazam')
print(b)
{'r', 'b', 'a', 'c', 'd'} {'z', 'a', 'l', 'c', 'm'}
Differenzmenge¶
Differenzmenge
enthält alle Buchstaben aus a, die nicht in b enthalten sind
c = a - b
print(c)
{'b', 'd', 'r'}
Vereinigungsmenge¶
Vereinigungsmenge
enthält alle Buchstaben die sowohl in a als auch in b enthalten sind
c = a | b
print(c)
{'z', 'r', 'b', 'a', 'l', 'c', 'd', 'm'}
Schnittmenge¶
Schnittmenge
enthält alle Buchstaben die in a und auch in b enthalten sind
c = a & b
print(c)
{'a', 'c'}
Symmetrische Differenzmenge¶
Symmetrische Differenzmenge
enthält alle Buchstaben die in a und in b, jedoch nicht in beiden enthalten sind
c = a ^ b
print(c)
{'z', 'r', 'b', 'd', 'm', 'l'}
%%Mooc StringAssesment
Schnittmenge
Es ist folgender Code gegeben:
obstkorb = {'Apfel', 'Orange', 'Apfel', 'Pfirsich', 'Orange', 'Banane'}
nusskorb = {'Mandel', 'Cashewnuss', 'Erdnuss', 'Haselnuss', 'Walnuss', 'Mandel', 'Erdnuss', 'Paranuss', 'Walnuss', 'Erdnuss'}
korb = obstkorb & nusskorb
print(korb)
Welche Elemente enthält die Schnittmenge aus Obstkorb und Nusskorb ? Geben sie die Ausgabe des Print-Befehls an.
%%Mooc StringAssesment
Vereinigungsmenge und Symmetrische Differenzmenge
Es ist folgender Code gegeben:
obstkorb = {'Apfel', 'Orange', 'Apfel', 'Pfirsich', 'Orange', 'Banane'}
nusskorb = {'Mandel', 'Cashewnuss', 'Erdnuss', 'Haselnuss', 'Walnuss', 'Mandel', 'Erdnuss', 'Paranuss', 'Walnuss', 'Erdnuss'}
vereinigung = obstkorb | nusskorb
symmetrische_differenz = obstkorb ^ nusskorb
print(vereinigung == symmetrische_differenz)
Ist die Vereinigungsmenge der Symmetrischen Differenzmenge in folendem Fall identisch ? Geben sie die Ausgabe des Print-Befehls an.
%%Mooc Video
Weitere Literatur¶
%%Mooc WebReference
Sets
https://docs.python.org/3/tutorial/datastructures.html#sets
Hinweis: Beschreibung von Sets (Mengen)
%%Mooc WebReference
Set Types - set, frozenset
https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset
Hinweis: Detaillierte Beschreibung von Sets