Python Mengen (set und frozenset)           (C) 2020-2021 T.Birnthaler OSTC GmbH
=================================

Doku --> docs.python.org/3/library/stdtypes.html#set

Mengen (set und frozenset) speichern nur eindeutige Keys (UNIQUE), diese müssen
IMMUTABLE Objekte (NoneType, bool, int, float, complex, str, tuple, bytes) bzw.
eigentlich HASHABLE Objekte sein. D.h. der gleiche KEY darf nur 1x vorkommen.

  s1 = set({})                             # Leere Menge, NICHT {} = leeres dict
  s2 = {"abc", True, 123, -3.14, (1,2,3)}  # 5 Elemente
  s3 = {1, 2, 3}                           # 3 Elemente

Sie lassen sich als "degeneriertes" Dictionary betrachten, bei denen zum KEY
der VALUE fehlt, d.h. die Zugriffsgeschwindigkeit auf einen bestimmten Key ist
unabhängig von der Set-Größe immer gleich schnell (RANDOM ACCESS).

Von Sets (mutable) + Frozensets (immutable) unterstützte Operationen (S, S2, T
sind Sets, K ist ein Key):

ACHTUNG: Nur lesende Operationen, das Set S bleibt unverändert!

+------------------------------------+------------------------------+
| len(S)                             | Anzahl Elemente              |
| S2 = S.copy()                      | Shallow/Flache Kopie         |
+------------------------------------+------------------------------+
| K in S                             | Ist Element enthalten?       |
| K not in S                         | Ist Element nicht enthalten? |
+---------------------------+--------+------------------------------+
| S.isdisjoint(T)           |        | Schnittmenge leer?           |
| S.issubset(T)             | S <= T | Ist Teilmenge (unecht)?      |
|                           | S < T  | Ist echte Teilmenge?         |
| S.issuperset(T)           | S >= T | Ist Obermenge (unecht)?      |
|                           | S > T  | Ist echte Obermenge?         |
+---------------------------+--------+------------------------------+
| S.union(T)                | S | T  | Vereinigungsmenge            |
| S.intersection(T)         | S & T  | Schnittmenge                 |
| S.difference(T)           | S - T  | Differenzmenge               |
| S.symmetric_difference(T) | S ^ T  | Symmetrische Differenzmenge  |
+---------------------------+--------+------------------------------+

Nur von Sets (mutable) unterstützte Operationen (S, T sind Sets, K ist ein Key):

ACHTUNG: Schreibende Operationen,
         das Set S wird verändert (bleibt aber das gleiche Objekt)!

ACHTUNG: Operationen |= &= -= ^= sind auf Frozenset anwendbar,
         erzeugen aber NEUEN Frozenset!

+----------------------------------+-------------------------------------------+
| S.add(K)                         | Element hinzufügen                        |
| S.remove(K)                      | Element entfernen (oder KeyError)         |
| S.discard(K)                     | Element entfernen (kein KeyError)         |
| S.pop()                          | Bel. Element entfernen + zurück (KeyError)|
+----------------------------------+--------+----------------------------------+
| S.update(T)                      | S |= T | Vereinigungsmenge zuweisen       |
| S.intersection_update(T)         | S &= T | Schnittmenge zuweisen            |
| S.difference_update(T)           | S -= T | Differenzmenge zuweisen          |
| S.symmetric_difference_update(T) | S ^= T | Symmetrische Differenzmenge zuw. |
+----------------------------------+--------+----------------------------------+
| S.clear()                        | Set leeren (alle Elemente entfernen)      |
+----------------------------------+-------------------------------------------+

HINWEIS: Bei Zugriff auf eine Menge mit einem nicht vorhanden Key wird
         die Exception "KeyError" ausgelöst.

HINWEIS: Seit Python 3.7 entspricht die Element-Reihenfolge im Set der
Einfüge-Reihenfolge und bleibt bei Operationen auf dem Set erhalten. Vorher war
die Reihenfolge der Elemente ZUFÄLLIG und konnte sich jederzeit ändern.