Python

Was ist eigentlich ein set in Python? (dt. Menge)

Sei die Erste, die diesen Beitrag teilt!

Falls du schon länger mit Python programmierst, dann ist dir bestimmt schon mal der eingebaute Datentyp set, auf Deutsch Menge, begegnet. Es handelt sich bei der Datenstruktur set in Python um einen eingebauten unveränderlichen* Datentyp, der mehrere Werte beinhaltet. Das werden wir uns im folgenden genauer anschauen.

*einzelne Werte eines sets können nicht verändert werden, aber es können Werte gelöscht und neue hinzugefügt werden.

Die Datenstruktur set (Menge)

Ein set ist eine Datenstruktur, die zu den eingebauten Datentypen in Python gehört.

Sets bezeichnen Zusammenfassungen mehrerer Datenwerte und verhalten sich ähnlich wie Mengen in der Mathematik. Das Wort set heißt übersetzt also einfach Menge.

Das bedeutet, sets in Python können, wie Mengen in der Mathematik, vereinigt oder geschnitten werden und es gibt eine Komplementbildung. Das sind einige Fachbegriffe von denen du vielleicht noch nie gehört hast. Kein Problem, wir schauen uns in diesem Beitrag einige Beispiele dazu an.

Außerdem können Elemente aus sets entfernt und hinzugefügt werden. Und jedes Element kann nur einmal in einer Menge auftauchen.


Los geht’s mit ein paar Beispielen:

Beispiele für sets (Mengen) in Python

Im folgenden Codebeispiel habe ich zwei Variablen menge_1 und menge_2 deklariert und mit zwei sets initialisiert.

menge_1 = {1.5, 3, 1}
menge_2 = {"Banane", True, 2, 8.23123}
print(menge_1, menge_2)

Wie du siehst, enthält die erste Menge drei Zahlen und die zweite Menge eine Mischung aus Zeichenketten, Zahlen und dem Boole’schen Wert True. Es können also völlig verschiedenen Datentypen in einem set gespeichert werden.

Man erkennt, dass es sich um eine Menge handelt, da die Werte innerhalb von geschweiften Klammern stehen.

Außerdem werden die Werte durch Kommata getrennt.

Hinweis: Es gibt auch sogenannte Dictionaries in Python, die ebenfalls durch geschweifte Klammern markiert sind. Sie enthalten allerdings nicht nur Kommas, sondern auch Doppelpunkte. Um diese geht es in diesem Artikel nicht!

Lassen wir den Code ausführen, erscheint auf der Console folgendes:

>> {1.5, 3, 1} {8.23123, True, 2, 'Banane'}

Es erscheinen einfach die beiden definierten Mengen.

Allerdings interessanterweise wurde bei der zweiten Menge die Reihenfolge der Elemente von Python vertauscht.

Das ist wichtig, bei Mengen spielt die Reihenfolge der Elemente keine Rolle. Sprich, es ist egal, ob du {2, 3} oder {3, 2} eintippst.

Listen, Sets u. Dictionaries können keine Elemente in sets sein

Wie im vorherigen Beispiel gesehen, kannst du verschiedene Datentypen in einem set in Python speichern. Es gibt dabei aber Folgendes zu beachten.

Man kann in einer Menge keine Liste, eine andere Menge oder ein Dictionary speichern! Dann wirst du einen TypeError erhalten:

Beispielcode:

menge = {{1,2}, "hi"}
print(menge)

Ausgabe:

>> TypeError: unhashable type: 'set'

Achte also darauf, welche Elemente deine Menge enthält.

Anzahl der Elemente einer Menge

Ähnlich, wie bei Zeichenketten und Listen, kannst du dir mit der len()-Funktion, die Anzahl der Elemente in einer Menge ausgeben lassen.

menge = {1, 2, 3, 4}
print(len(menge))
>> 4

Bei sets (Mengen) ist die Reihenfolge der Elemente egal

Wie in der Mathematik auch, spielt es keine Rolle in welcher Reihenfolge die Elemente in einer Menge gespeichert werden.

Bei sets in Python handelt es sich folglich um eine Datenstruktur, die mehrere Werte speichert, unabhängig der Reihenfolge der Eingabe.

Das lässt sich in folgendem Beispiel gut erkennen.

menge_2 = {"Banane", True, 2, 8.23123}
menge_3 = {"Banane", True, 8.23123, 2}
print(menge_3 == menge_2)

Ich habe zwei Mengen, die die gleichen Werte beinhalten, definiert. Allerdings ist die Reihenfolge etwas verändert. Die Zahl 2 steht bei den beiden sets an unterschiedlichen Stellen.

In Zeile 3 steht ein print-Befehl, der auf der Console ausgeben wird, ob die beiden Mengen gleich sind. Ich habe den Vergleichsoperator == verwendet, um die Gleichheit der Mengen zu prüfen.

Und tatsächlich, auf der Console erscheint:

True

Mengen (sets) enthalten keine Duplikate

In einer Menge kann jeder Wert nur einmal vorkommen. Wenn wir also zwei Mal den Wert “2” einer Menge hinzufügen, dann wird das von Python einfach ignoriert.

Siehe folgendes Codebeispiel:

menge = {1, 2, "hi", 2, 4.4, "Miau"}
print(menge)

Die Zahl 2 wurde bei der Initialisierung der Menge zwei Mal aufgezählt. Auf der Console erscheint:

>> {1, 2, 4.4, 'Miau', 'hi'}

Die Zahl 2 wird nur einmal ausgegeben.


Eine leere Menge in Python erstellen

Weiter oben habe ich bereits erwähnt, dass geschweifte Klammern auch für Dictionaries in Python verwendet werden.

Deshalb muss man die eingebaute Funktion set() verwenden, um eine leere Menge in Python zu erstellen.

Achtung: Der Befehl {} erstellt ein Dictionary.

beispiel_1 = set()
beispiel_2 = {}
print(type(beispiel_1))
print(type(beispiel_2))

Mit der type-Funktion können wir uns den Datentyp eines Werts ausgeben lassen. In diesem Beispiel erhalten wir als Ausgabe:

<class 'set'>
<class 'dict'>



Prüfen, ob ein Element in einem set enthalten ist

Genau wie bei Listen, Tupeln u.A. kann man in Python prüfen, ob ein gewisses Element in einer Menge (set) enthalten ist.

Dafür verwendet man die Operatoren in oder not in.

Schauen wir uns ein Beispiel an:

gemuese = {"gurke", "tomate", "karotte", "brokkoli"}
print("lauch" in gemuese)
print("gurke" in gemuese)

Wie du dir vielleicht schon denken kannst, wird auf der Console False und True nacheinander ausgegeben werden, da “lauch” kein Element in unserer Menge gemuese ist, “gurke” allerdings schon.

Auf Run drücken ergibt:

>> False
>> True

Der Befehl not in macht natürlich genau das Gegenteil von in. Probiere es gern selbst mit einem Codebeispiel aus.


Teilmengen, Obermengen und disjunkte Mengen in Python

Eine Menge A heißt Teilmenge der Menge B, falls alle Elemente aus A auch Elemente in B sind.

B wird dann auch Obermenge von A genannt.

Die Begriffe Teilmenge und Obermenge, heißen auf englisch subset und superset.

In Python gibt es die Möglichkeit zu prüfen, ob eine Menge eine Teilmenge oder eine Obermenge einer bestimmten anderen Menge ist.

Außerdem muss man wissen, dass zwei Mengen disjunkt (engl. disjoint) heißen, falls sie keine gemeinsamen Elemente haben.

Hier ein Beispiel:

A = {2, 3}
B = {2, 3, 4, 5}
C = {6, 7}
print(A.issubset(B))
print(B.issuperset(A))
print(C.isdisjoint(B))

Die Elemente der Menge A sind alle in der Menge B enthalten. Also ist A eine Teilmenge von B.

Der Befehle print(A.issubset(B)) wird also True liefern.

Andersrum ist folglich B eine Obermenge von A und wir werden auch für den Befehl B.issuperset(A) den Wert True zurückbekommen.

Und zu guter Letzt die Menge C, die hat mit A und B gar nichts gemeinsam. Prüfen wir mit dem Befehl C.isdisjoint(B), ob C und B disjunkt sind, dann erhalten wir auch dafür den Wert True zurück:

>> True
>> True
>> True

Bemerkung: Die Methode .isdisjoint() ist kommutativ. Das heißt es ist egal, ob man C.isdisjoint(B) oder B.isdisjoint(C) schreibt.


Elemente aus einem set entfernen

Es gibt zwei verschiedene Möglichkeiten Elemente aus einem set zu entfernen. Dies funktioniert ähnlich wie bei Listen.

remove-Methode bei sets

Wenn wir wissen, welches Element wir löschen wollen, dann verwenden wir die remove-Methode.

Bleiben wir bei unserem Gemüsebeispiel von vorhin.

Code:

gemuese = {"gurke", "tomate", "karotte", "brokkoli"}
gemuese.remove("gurke")
print(gemuese)

Ausgabe:

>> {'brokkoli', 'tomate', 'karotte'}

Wir sehen, dass das Element “gurke” aus der Menge gemuese entfernt wurde.

Es gibt noch eine weitere Methode Elemente aus einer Menge in Python zu entfernen.

pop-Methode bei sets

Wollen wir hingegen irgendein Element entfernen, völlig egal welches, dann verwenden wir die pop-Methode.

Code:

gemuese = {"gurke", "tomate", "karotte", "brokkoli"}
print(gemuese)
gemuese.pop()
print(gemuese)

Ausgabe:

>> {'brokkoli', 'tomate', 'karotte', 'gurke'}
>> {'tomate', 'karotte', 'gurke'}

Meiner Meinung nach, wird mit der .pop()-Methode nicht irgendein Element aus der Menge entfernt, sondern immer das Erste. Das Problem ist nur, dass wir selbst ja nicht wissen, wie Python die Menge ausgibt.

Welches Element ist für Python „das Erste“ in einer Menge ist, wissen wir nicht.

Weiter oben haben wir gelernt, dass es keine festgelegte Reihenfolge bei sets in Python gibt, also wissen wir auch nicht, welches Element durch den pop-Befehl gelöscht wird. Falls jemand dazu mehr weiß oder andere Erfahrungen gemacht hat, bitte ein Kommentar da lassen! 🙂

Wir können uns das gelöschte Element auch anzeigen lassen.

Code:

gemuese = {"gurke", "tomate", "karotte", "brokkoli"}
print(gemuese.pop()) # Das gelöschte Element wird ausgegeben
print(gemuese) # Die übrige Liste wird ausgegeben

Ausgabe:

>> brokkoli
>> {'tomate', 'karotte', 'gurke'}

Wie oben bereits zu sehen war: “brokkoli” wurde entfernt und übrig bleibt {”tomate”, “karotte”, “gurke”}.

discard-Methode auf set in Python anwenden

Im Gegensatz zur .pop()-Methode, können wir mit der .discard()-Methode ein vorgegebenes Element aus einer Menge in Python löschen. Sie liefert dasselbe Ergebnis, wie die .remove()-Methode von weiter oben.

(Falls jemand den Unterschied zwischen den beiden Methoden kennt, bitte Kommentar da lassen! Meiner Meinung nach sind sie genau gleich!)


Elemente zu einer Menge (set) hinzufügen

Logischerweise können wir nicht nur Elemente aus einer Menge löschen, sondern eine Menge um Elemente erweitern.

Wir wissen bereits, dass Python Dopplungen ignoriert. Sprich, fügen wir ein Element der Menge hinzu, das bereits in der Menge vorhanden ist, ändert sich an der Menge nichts.

Um ein Element einem set in Python hinzuzufügen verwenden wir den Befehl add().

Also name_der_menge.add(neues_Element).

Beispielcode:

menge = {1, 2, 'hi', False, (1, 2, 3)}
print(menge)
menge.add(10.001)
print(menge)

Ausgabe:

>> {False, 1, 2, (1, 2, 3), 'hi'}
>> {False, 1, 2, 10.001, (1, 2, 3), 'hi'}



Zu guter Letzt möchte ich mich in diesem langen Blogartikel noch mit den mengentheoretischen Operationen beschäftigen, die man auf sets in Python anwenden kann.

Wenn man noch nie was von Mengenlehre gehört hat, dann kommen einem die Begriffe sicher komisch vor. Ich hoffe die Beispiele können Aufschluss geben.

Mengenoperationen Vereinigung, Durchschnitt, Komplement und symmetrische Differenz (Python)

Die genannten Mengenoperationen Vereinigung, Durchschnitt und symmetrische Differenz kommen aus der mathematischen Theorie der Mengenlehre.

Hier geht es nur um Python, wir müssen also erstmal gar nicht wissen, woher das alles genau kommt.

Fürs erste reicht es uns zu wissen, dass es solche Mengenoperationen gibt und schauen uns Beispiele dazu an. Man muss nicht alles auswendig wissen, um gut zu programmieren. Es reicht aus, zu wissen wo man schauen muss und in welchen Kontext gewisse Befehle gehören.

Vereinigung (Union) von Mengen (sets)

Wir betrachten zwei Mengen A und B und wenden die union-Methode auf diese an. Union heißt auf Deutsch Vereinigung.

Schauen wir einfach mal, was passiert.

Beispielcode:

A = {1, 2, 3}
B = {4, 5}
print(A.union(B))
print(A | B)

Ausgabe:

>> {1, 2, 3, 4, 5}
>> {1, 2, 3, 4, 5}

Die Mengen A und B wurden vereinigt, das heißt die neue Menge besteht aus allen Elementen aus A und allen Elementen aus B.

Die Reihenfolge spielt für diese Operation keine Rolle.

Das heißt A.union(B) liefert das gleiche Ergebnis, wie B.union(A).

Wie du im Code sehen kannst, kannst du anstatt der .union()-Methode auch den Operator | verwenden. (Einfach ein grader Strich, wie ein Betragsstrich, bei Mac alt gr und 7 drücken*.)*

Wir wissen bereits, dass in Mengen alle Elemente nur einmal aufgezählt werden. Enthalten A und B gleiche Elemente, so kommen diese in der Vereinigung nur einmal vor.

Durchschnitt (Intersection) von Mengen (sets)

Nun kommen wir zum Durchschnitt, engl. intersection, zweier Mengen.

Beispielcode:

A = {1, 2, 3}
B = {2, 3, 4, 5}
print(A.intersection(B))
print(A & B)

Ausgabe:

>> {2, 3}
>> {2, 3}

Der Durchschnitt zweier Mengen A und B ist eine Menge, die alle Elemente enthält, die sowohl in A, als auch in B vorkommen.

In unserem Beispiel waren das die Elemente 2 und 3.

Haben die beiden Mengen nichts gemeinsam, so ist das Ergebnis die leere Menge. Also die Menge, die keine Element enthält.

Auch hier gilt A.intersection(B) ist das Gleiche, wie B.intersection(A).

Anstatt .intersection() kannst du den Operator & verwenden und zwischen die Mengen schreiben.

Differenz/Komplement von Mengen

Gegeben zwei Mengen A und B. Möchtest du alle Elemente aus A ausgeben, die allerdings nicht in B enthalten sind, so wird das mit dem Komplement von B bezüglich A bezeichnet.

Salopp ausgedrückt: Du berechnest die Menge A ohne B.

A = {1, 2, 3}
B = {2, 3, 4, 5}
print(A.difference(B))
print(A - B)

Ausgabe:

>> {1}
>> {1}

Achtung: Die Differenz von Mengen ist nicht kommutativ. Das heißt, du kannst die Reihenfolge von A und B in obigem Beispiel nicht vertauschen.

A – B ergibt etwas anderes, als B – A. Probier es aus!

Symmetrische Differenz von Mengen

Die symmetrische Differenz von zwei Mengen A und B ist eine Menge, die genau diejenigen Elemente enthält, die entweder in A oder in B liegen, aber nicht in beiden.

Die symmetrische Differenz besteht also aus der Vereinigung der beiden Mengen ohne deren Durchschnitt.

Beispielcode:

A = {1, 2, 3}
B = {2, 3, 4, 5}
print(A.symmetric_difference(B))
print(A ^ B)

Ausgabe:

>> {1, 4, 5}
>> {1, 4, 5}

Wie du in dem Codebeispiel siehst, kannst du für die symmetrische Differenz in Python entweder den Befehl .symmetric_difference() oder den Operator ^ verwenden.

Die symmetrische Differenz ist Kommutativ, das bedeutet hier ist es wieder egal, ob du A ^ B oder B ^ A schreibst.


Zusammenfassung aller Methoden für sets in Python

Hier eine Liste mit den wichtigsten Methoden für Mengen in Python. (Fast) alle habe ich in diesem Blogbeitrag ausführlich mit Beispielen erklärt. Ich wollte aber den Rahmen nicht sprengen und habe manche weggelassen, die man sich vll aus den Infos des Beitrags selbst erschließen kann:

Tabelle mit Übersicht aller set Methoden in Python

Angenommen wir haben Mengen mit den Namen menge, menge1, menge2 und menge3 in Python:

FunktionCodeErklärung
Element hinzufügenmenge.add(x)Element x in Klammern wird hinzugefügt
Gewisses Element entfernenmenge.remove(x) menge.discard(x)Element x in Klammern wird entfernt
Irgendein Element entfernenmenge.pop()Irgendein Element wird aus der Menge entfernt
Mengengeneratorset()eine leere Menge wird erstellt
Menge leerenmenge.clear()Löscht alle Elemente aus der Menge
Menge duplizierenmenge.copy()Erstellt eine Kopie der Menge
Differenz / Komplementmenge1.difference(menge2)
oder
menge1 – menge2
Erstellt Menge mit allen Elementen, die in menge1, ohne die Elemente aus menge2.
Durchschnittmenge1.intersection(menge2)
oder
menge1 & menge2
Erstellt Menge mit allen Elementen, die sowohl in menge1, als auch in menge2 vorkommen
Vereinigungmenge1.union(menge2)
oder
menge1 | menge2
Erstellt Menge mit allen Elementen aus menge1 und aus menge2. Dopplungen werden nur einmal aufgezählt.
symmetrische Differenzmenge1.symmetric_difference(menge2)
oder
menge1 ^ menge2
Alle Element aus menge1 und alle Elemente aus menge2, ohne die Elemente, die in beiden vorkommen.
Teilmengenmenge1.issubset(menge2)Gibt Wahrheitswert zurück, prüft ob menge1 Teilmenge von menge2 ist.
Obermengenmenge2.issuperset(menge1)Gibt wahr oder falsch zurück, je nach dem, ob menge2 Obermenge von menge1 ist.
disjunkte Mengenmenge2.disjoint(menge3)Gibt wahr zurück, wenn die Mengen menge2 und menge3 disjunkt sind, also keine gemeinsamen Elemente haben.
Tabelle: Zusammenfassung der Methoden für sets in Python

Wenn du bis hier gekommen bist, herzlichen Glückwunsch. Das war ein wirklich langer Blogeintrag.

Mengen (sets) sind, meiner Meinung nach, eine Datenstruktur für Fortgeschrittene.

Nicht, weil sie besonders schwer umzusetzen sind, sondern weil sie Eigenschaften haben, die sehr nah an der mathematischen Theorie der Mengenlehre sind.

Es gibt viele Begriffe, die man im Kontext der sets verstehen muss, Teilmenge, Vereinigung, Schnitt, etc.

Außerdem benötigt man sie, im Gegensatz zu den meisten Basics, wie for- und while-Schleife, if-Anweisungen usw., nicht von Anfang an.

Nichtsdestotrotz sind sie ein wichtiges Tool, dass man kennen sollte.

Lass mir gerne ein Kommentar mit Anregungen oder Fragen da. Natürlich auch gerne, falls dir ein Fehler auffällt.

Wem gehts noch so beim Schreiben eigener Artikel und Arbeiten, dass man irgendwann den Wald vor lauter Bäumen nicht mehr sieht.

Für dich vielleicht ebenfalls interessant...

1 Kommentar

  1. Oldie sagt:

    pop() entfernt kein zufälliges Element, sondern immer das Erste im set.
    >>> print(py_set)
    {‚f‘, ‚a‘, ‚e‘, ‚w‘, ‚za‘, ‚ft‘, ‚ke‘, ‚hd‘, ‚d‘, ‚fa‘, ‚lw‘, ‚l‘}
    >>> py_set.pop()
    ‚f‘
    >>> print(py_set)
    {‚a‘, ‚e‘, ‚w‘, ‚za‘, ‚ft‘, ‚ke‘, ‚hd‘, ‚d‘, ‚fa‘, ‚lw‘, ‚l‘}
    .pop() verändert die Struktur der Menge nicht!
    ein Backup erstellen:
    py_set={‚a‘, ‚e‘, ‚w‘, ‚za‘, ‚ft‘, ‚ke‘, ‚hd‘, ‚d‘, ‚fa‘, ‚lw‘, ‚l‘}
    >>> py_set_backup=py_set.copy()
    >>> py_set.clear()
    >>> py_set_backup
    {‚a‘, ‚w‘, ‚e‘, ‚ke‘, ‚za‘, ‚hd‘, ‚ft‘, ‚d‘, ‚fa‘, ‚lw‘, ‚l‘}
    Ändern des Variablennamen:
    >>> py_set=py_set_backup
    >>> print(py_set)
    {‚a‘, ‚w‘, ‚e‘, ‚ke‘, ‚za‘, ‚hd‘, ‚ft‘, ‚d‘, ‚fa‘, ‚lw‘, ‚l‘}
    Reihenfolge bleibt erhalten
    Ich vermute, daß die Reihenfolge der Menge erhalten bleibt, so lange der interne Speicherort nicht verändert wird.
    Grundsätzlich ist aber richtig .pop() löscht eine zufällige Komponente.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert