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}undy = {"a": 5, "e": 6, "f": 7}. Was wäre der Inhalt vonx, 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?