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.

In [3]:
Vereinigungsmenge

Schnittmenge

Die Schnittmenge ist die Menge der Elemente, die in allen zu untersuchenden Mengen enthalten sind.

In [4]:
Schnittmenge

Differenzmenge

Die Differenzmenge zweier Mengen ist die Menge der Elemente, die in der einen Menge, aber nicht in der anderen Menge enthalten sind.

In [5]:
Differenzmenge

Symmetrische Differenzmenge

Es handelt sich um die Menge aller Elemente, die jeweils in einer, aber nicht in beiden Mengen liegen

In [6]:
Symmetrische Differenzmenge

Syntax

Geschweifte Klammern

Ein set wird durch geschweifte Klammern erzeugt. Ein set darf keine veränderlichen Datentypen, wie Listen oder Dictionaries enthalten.

In [7]:
obstkorb = {'Apfel', 'Orange', 'Apfel', 'Pfirsich', 'Orange', 'Banane'}
print(obstkorb)
{'Apfel', 'Orange', 'Pfirsich', 'Banane'}
In [8]:
%%Mooc MultipleChoiceAssessment
Out[8]:

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?

{'Mandel', 'Cashewnuss', 'Erdnuss', 'Haselnuss', 'Walnuss', 'Mandel', 'Erdnuss', 'Paranuss', 'Walnuss', 'Erdnuss'}
{'Cashewnuss', 'Erdnuss', 'Haselnuss', 'Walnuss', 'Mandel', 'Erdnuss', 'Paranuss', 'Walnuss', 'Erdnuss'}
{'Cashewnuss', 'Erdnuss', 'Haselnuss', 'Walnuss', 'Mandel', 'Paranuss', 'Walnuss', 'Erdnuss'}
{'Cashewnuss', 'Erdnuss', 'Haselnuss', 'Mandel', 'Paranuss', 'Walnuss', 'Erdnuss'}
{'Cashewnuss', 'Erdnuss', 'Haselnuss', 'Mandel', 'Paranuss', 'Walnuss'}

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.

In [9]:
a = set('abracadabra')
print(a)
{'r', 'b', 'a', 'c', 'd'}
In [10]:
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'}
In [11]:
%%Mooc StringAssessment
Out[11]:

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

In [12]:
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.

In [13]:
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.

In [14]:
print('Orange' in obstkorb)
True
In [15]:
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.

In [16]:
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.

In [17]:
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.

In [18]:
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.

In [19]:
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

In [20]:
a = set('abracadabra')
print(a)
b = set('alacazam')
print(b)
{'r', 'b', 'a', 'c', 'd'}
{'z', 'a', 'l', 'c', 'm'}

Differenzmenge

In [21]:
Differenzmenge

enthält alle Buchstaben aus a, die nicht in b enthalten sind

In [22]:
c = a - b
print(c)
{'b', 'd', 'r'}

Vereinigungsmenge

In [23]:
Vereinigungsmenge

enthält alle Buchstaben die sowohl in a als auch in b enthalten sind

In [24]:
c = a | b
print(c)
{'z', 'r', 'b', 'a', 'l', 'c', 'd', 'm'}

Schnittmenge

In [25]:
Schnittmenge

enthält alle Buchstaben die in a und auch in b enthalten sind

In [26]:
c = a & b
print(c)
{'a', 'c'}

Symmetrische Differenzmenge

In [27]:
Symmetrische Differenzmenge

enthält alle Buchstaben die in a und in b, jedoch nicht in beiden enthalten sind

In [28]:
c = a ^ b
print(c)
{'z', 'r', 'b', 'd', 'm', 'l'}
In [29]:
%%Mooc StringAssesment
Out[29]:

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.



In [30]:
%%Mooc StringAssesment
Out[30]:

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.



In [31]:
%%Mooc Video
Out[31]:

Weitere Literatur

In [32]:
%%Mooc WebReference

Sets

https://docs.python.org/3/tutorial/datastructures.html#sets

Hinweis: Beschreibung von Sets (Mengen)

In [33]:
%%Mooc WebReference

Set Types - set, frozenset

https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset

Hinweis: Detaillierte Beschreibung von Sets