Dictionaries

Dictionaries bestehen aus Schlüssel-Wert-Paaren. Schlüssel müssen vom unveränderlichen Typ sein, einschließlich Zahlen, Zeichenketten und Tupel.

Warnung

Auch wenn ihr in einem Dictionary verschiedene Schlüsseltypen verwenden könnt, solltet ihr das vermeiden, da dadurch nicht nur die Lesbarkeit sondern auch die Sortierung erschwert wird.

Werte können alle Arten von Objekten sein, einschließlich veränderlicher Typen wie Listen und Dictionaries.

>>> timeseries = {
...     "2022-01-31": -0.751442,
...     "2022-02-01": 0.816935,
...     "2022-02-02": -0.272546,
... }
>>> timeseries["2022-02-03"] = -0.268295

Wenn ihr versucht, auf den Wert eines Schlüssels zuzugreifen, der nicht im Dictionary enthalten ist, wird eine KeyError-Exceptions ausgelöst. Um diesen Fehler zu vermeiden, gibt die Dictionary-Methode get optional einen benutzerdefinierten Wert zurück, wenn ein Schlüssel nicht in einem Wörterbuch enthalten ist.

>>> timeseries["2022-02-03"]
-0.268295
>>> timeseries["2022-02-04"]
Traceback (most recent call last):
  File "<python-input-15>", line 1, in <module>
    timeseries["2022-02-04"]
    ~~~~^^^^^^^^^^^^^^
KeyError: '2022-02-04'
>>> timeseries.get("2022-02-03", "Messwert nicht vorhanden")
-0.268295
>>> timeseries.get("2022-02-04", "Messwert nicht vorhanden")
'Messwert nicht vorhanden'

Weitere Dict-Methoden

Die in Dicts eingebaute Funktion len gibt die Anzahl der Schlüssel-Wert-Paare zurück. Die del-Anweisung kann zum Löschen eines Schlüssel-Wert-Paares verwendet werden. Wie bei Listen sind mehrere Dictionary-Methoden (clear, copy, fromkeys, get, items, keys, update und values) verfügbar.

Die Methoden keys, values und items geben keine Listen zurück, sondern Dictionary-View-Objekte, die sich wie Sequenzen verhalten, aber dynamisch aktualisiert werden, wenn sich das Dictionary ändert. Aus diesem Grund müsst ihr die Funktion list verwenden, damit sie in diesen Beispielen zu einer Liste werden:

>>> list(timeseries.keys())
['2022-01-31', '2022-02-01', '2022-02-02', '2022-02-03']

Ab Python 3.6 behalten Dictionaries die Reihenfolge bei, in der die Schlüssel erstellt wurden, und sie werden mit keys auch in dieser Reihenfolge zurückgegeben.

Dicts zusammenführen

Mit der dict.update()-Methode könnt ihr zwei Dictionaries zu einem einzigen Dictionary zusammenfügen:

>>> titles = {7.0: "Data Types", 7.1: "Lists", 7.2: "Tuples"}
>>> new_titles = {7.0: "Data types", 7.3: "Sets"}
>>> titles.update(new_titles)
>>> titles
{7.0: 'Data types', 7.1: 'Lists', 7.2: 'Tuples', 7.3: 'Sets'}

Bemerkung

Die Reihenfolge der Operanden ist wichtig, da 7.0 dupliziert wird und der Wert des letzten Schlüssel den vorhergehenden überschreibt.

setdefault

setdefault kann verwendet werden, um Zähler für die Schlüssel eines Dicts bereitzustellen, z.B.:

>>> titles = ["Data types", "Lists", "Sets", "Lists"]
>>> for title in titles:
...     titles_count.setdefault(title, 0)
...     titles_count[title] += 1
...
>>> titles_count
{'Data types': 1, 'Lists': 2, 'Sets': 1}

Bemerkung

Solche Zähloperationen verbreiteten sich schnell, sodass später die Klasse collections.Counter zur Python-Standardbibliothek hinzugefügt wurde. Diese Klasse kann die oben genannten Operationen viel einfacher durchführen:

>>> collections.Counter(titles)
Counter({'Lists': 2, 'Data types': 1, 'Sets': 1})

Erweiterungen

python-benedict

dict-Unterklasse mit Keylist/Keypath/Keyattr-Unterstützung sowie I/O-Shortcuts.

pandas

kann Dicts in Series und DataFrames überführen.

Checks

  • Angenommen, ihr habt die beiden Dictionaries x = {"a": 1, "b": 2, "c": 3, "d": 4} und y = {"a": 5, "e": 6, "f": 7}. Was wäre der Inhalt von x, nachdem die folgenden Codeschnipsel ausgeführt wurden?

    >>> del x["b"]
    >>> z = x.setdefault("e", 8)
    >>> x.update(y)
    
# Welcher der folgenden Ausdrücke kann ein Schlüssel eines Dictionary sein:

1; "Veit"; ("Veit", [1]); [("Veit", [1])]; ["Veit"]; ("Veit", "Tim", "Monique")

  • Ihr könnt ein Dictionary verwenden, und das wie eine Tabelle verwenden, indem ihr Tupel als Schlüssel für die Zeilen- und Spaltenwerte verwendet. Schreibt Beispielcode, um Werte hinzuzufügen und wieder abzufragen.

  • Wie könnt ihr alle Dubletten aus einer Liste entfernen ohne die Reihenfolge der Elemente in der Liste zu ändern?