Python Dictionaries (dict)                  (C) 2020-2021 T.Birnthaler OSTC GmbH
==========================

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

Dictionaries (dict) (auch Map, Hash, Zuordnung oder Assoziatives Array genannt)
speichern PAARE (Key, Value) von Werten und damit eine "Beziehung" zwischen
zwei Datenwerten (Key --> Value).

* Keys müssen IMMUTABLE Objekte bzw. eigentlich HASHABLE Objekte sein
  (NoneType, bool, int, float, complex, str, tuple, bytes).

* Keys müssen UNIQUE sein (d.h. der gleiche Key darf nur 1x vorkommen).

* Als Value sind beliebige Python-Objekte erlaubt.

* Values dürfen NON-UNIQUE sein (d.h. der gleiche Value darf mehrfach vorkommen).

  d1 = {}                                         # Leeres Dictionary
  d2 = {"abc": 123, True: 4.0, (1,2): None}       # 3 Paare
  d3 = {"a": 1, "b": 2, "c": 1, "d": 2, "e": 3}   # 5 Paare

Die Zugriffsgeschwindigkeit auf einen bestimmten Key (und damit seinen Value)
ist unabhängig von der Dictionary-Größe immer gleich schnell (RANDOM ACCESS).

Die Zugriffsgeschwindigkeit auf einen bestimmten Value ist abhängig von der
Dictionary-Größe und immer langsam (da sie das Durchsuchen des gesamten
Dictionarys erfordert).

Folgende Operation werden von Python Dictionaries unterstützt (K ist ein Key =
immutable Objekt, V und DFLT sind Values = beliebige Objekte, D, D2 und E sind
Dictionaries, ITBL ist ein Iterable, L ist eine Liste):

ACHTUNG: Nur lesende Operationen, das Dictionary D bleibt unverändert!

+-----------------------+------------------------------------------------------+
| len(D)                | Anzahl Keys, Values, Paare                           |
+-----------------------+------------------------------------------------------+
| K in D                | Ist Key enthalten?                                   |
| K not in D            | Ist Key nicht enthalten?                             |
+-----------------------+------------------------------------------------------+
| V = D[K]              | Value von Key holen (oder KeyError falls Key fehlt)  |
| V = D.get(K, DFLT)    | Value von Key holen (oder DFLT)                      |
+-----------------------+------------------------------------------------------+
| L = D.keys()          | Liste aller Keys (unsortiert)                        |
| L = D.values()        | Liste aller Values (unsortiert)                      |
| L = D.items()         | Liste aller (Key,Value)-Paare (unsortiert)           |
+-----------------------+------------------------------------------------------+
| L = list(D)           | Abkürzung für D.keys()                               |
| L = iter(D)           | Abkürzung für iter(D.keys())                         |
| L = reversed(D)       | Abkürzung für reversed(D.keys())                     | 3.8
+-----------------------+------------------------------------------------------+
| D2 = D.copy()         | Shallow/Flache Kopie                                 |
+-----------------------+------------------------------------------------------+
| E = D | D2            | D vereinigt mit D2, D2-Val überschreibt D bei gl. Key| 3.9
+-----------------------+------------------------------------------------------+

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

+-----------------------+------------------------------------------------------+
| D[K] = V              | Value zu Key setzen (oder ersetzen)                  |
| D.setdefault(K, DFLT) | Value zu Key auf DFLT setzen (falls nicht vorhanden) |
|                       | + Value von Key zurückgeben                          |
+-----------------------+------------------------------------------------------+
| del D[K]              | Key + Value löschen (oder KeyError falls Key fehlt)  |
| V = D.pop(K, DFLT)    | Value von Key holen (KeyError/DFLT) + Key löschen    |
| (K,V) = D.popitem()   | Paar holen + entfernen (KeyError falls D leer)       |
+-----------------------+------------------------------------------------------+
| D = fromkeys(ITBL, V) | Dict mit Keys aus ITBL + Value V (None) erzeugen     |
| D.update(D2)          | Paare aus D2 hinzufügen (vorhandene überschreiben)   |
| D.clear()             | Dictionary leeren (alle Keys + Values entfernen)     |
+-----------------------+------------------------------------------------------+
| D |= D2               | D2 zu D hinzufügen, D2-Val überschreibt D bei gl. Key| 3.9
+-----------------------+------------------------------------------------------+

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

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