Zum Inhalt

Dictionaries

Ein Dictionary speichert seinen Inhalt in Key/Value (Schlüssel/Wert) Paaren ab. Der Datentyp der Werte kann beliebig sein. Ähnliches gilt für die Schlüssel, jedoch muss der Datentyp unveränderbar sein (int, float, String, Tuple, ...). Der Zugriff auf die Values erfolgt dabei über den Key und nicht, wie bei Listen, über einen Index.

  • Die Datentypen für den Key müssen hashable sein.

Bis einschließlich der Python Version 3.6 gab es für die Key/Value Paare eines Dictionaries keine feste Reihenfolge. D.h.: hat man in einer for Schleife (Beispiele siehe weiter unten) über die Keys eines Dictionaries iteriert, hing die Reihenfolge der Keys von der verwendeten Python Implementierung ab. Seit der Python Version 3.7 sind Dictionaries ordered, d.h. die Key/Value Paare werden in einer festen Reihenfolge ausgegeben. Die Reihenfolge richtet sich nach dem Zeitpunkt, zu dem sie in das Dictionary eingestellt wurden.

Anlegen eines Dictionaries

Man kann entweder ein leeres Dictionary anlegen

dict = {}
## {}

oder

d = dict()
## {}

oder das Dictionary mit Inhalt anlegen

dict = {
    "key1": "val1",
    "key2": "val2"
}
## {'key1': 'val1', 'key2': 'val2'}

Zugriff auf einen Wert im Dictionary

Auf die Werte im Dictionary wird mit dem Schlüssel zugegriffen:

value = dict[key]

value = dict["key1"]
## val1

Greift man auf einen Key zu, den es im Dictionary nicht gibt, wird ein KeyError geworfen.

Zugriff auf einen Wert im Dictionary - auch wenn der Key nicht existiert

value = dict.get(key)

Ist der Key nicht im Dictionary, wird None zurückgegeben.

value = dict.get(key, default_value)

Ist der Key nicht im Dictionary, wird der angegebene Defaultwert zurückgegeben.

Default Dictionary

Statt jedes Mal beim Aufruf von get einen Defaultwert mitzuübergeben, kann man auch die Klasse defaultdict verwenden.

from collections import defaultdict

def default_value():
    return 0

dict = {}
d = defaultdict(default_value, dict)
value = d.get(key)

Wir jetzt beim Aufruf von get ein Key verwendet, der nicht im Dictionary abgelegt ist, wird der Wert, den die Funktion default_value zurückgibt (im Beispiel 0) zurückgegeben.

Ein Key/Value Paar zum Dictionary hinzufügen:

dict[key] = value

dict["key3"] = "val3"
dict
## {'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}

Ein Key/Value Paar auf einem Dictionary löschen

del(dict[key])
oder 
del dict[key]

del dict["key3"]
dict
## {'key1': 'val1', 'key2': 'val2'}

Wird ein Key verwendet, des es im Dictionary nicht gibt, wird ein KeyError geworfen.

Löschen und lesen

value = dict.pop(key)

value = dict.pop("key2")
## val2
dict
## {'key1': 'val1'}

Greift man auf einen Key zu, den es im Dictionary nicht gibt, wird ein KeyError geworfen.

Man kann abeim Auruf auch einen Defaultwert angeben, der zurückgegeben wird, wenn der Key im Dictionary nicht gefunden wird

value = dict.pop(key, default_value)

value = dict.pop("key42", "Don't Panic!")
## Don't Panic!

Anzahl der Key/Value Paare in einem Dictionary

len(dict)

dict = { "key1": "val1", "key2": "val2" }
## {'key1': 'val1', 'key2': 'val2'}
len(dict)
## 2

Abfragen ob ein Key in einem Dictionary enthalten ist

key1 in dict

if "key1" in dict:
    print("gefunden, Wert: ", dict["key1"])

Abfragen ob ein Key nicht in einem Dictionary enthalten ist

key1 not in dict

if "key1" not in dict:
    print("nicht gefunden")

Alle Keys aus einem Dictionary lesen

for key in dict:
    print(key)

Oder

for key in dict.keys():
    print(key)

Alle Keys aus einem Dictionary als Enumeration lesen

dict
## {'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}

list(enumerate(dict))
## [(0, 'key1'), (1, 'key2'), (2, 'key3')]  [(0, 'key1'), (1, 'key2'), (2, 'key3')]

for count, key in enumerate(dict):
    print(f"count: {count} , key: {key}")

Ausgabe:
count: 0 , key: key1
count: 1 , key: key2
count: 2 , key: key3

Sieh auch: enumerate in der Python Dokumentation.

Alle Keys in einer Liste speichern

liste = list(dict.keys())

Abfragen ob ein Wert in einem Dictionary enthalten ist

value in dict.values()

if "val1" in dict.values():
    print("gefunden")

Abfragen ob ein Wert nicht in einem Dictionary enthalten ist

value not in dict.values()

if "val1" not in dict.values():
    print("nicht gefunden")

Alle Values aus einem Dictionary lesen

for key in dict:
    print(dict[key])

Oder

for value in dict.values():
    print(value)

Alle Values in einer Liste speichern

liste = list(dict.values())

Alle Key/Value Paare aus einem Dictionary lesen

Jedes Paar als Tuple

for item in dict.items():
    print(item[0], item[1])

Alles Paare in einer Liste speichern

liste = list(dict.items())

Jedes Paar als einzelne Werte: key, value

for key, value in dict.items():
    print(key, value)

Alle Key/Value Paare aus einem Dictionary als Enumeration lesen

dict
## {'key1': 'val1', 'key2': 'val2', 'key3': 'val3'}

for count, (key, value) in enumerate(dict.items()):
    print(f"count: {count} , key: {key} , value: {value}")


Ausgabe:
count: 0 , key: key1 , value: val1
count: 1 , key: key2 , value: val2
count: 2 , key: key3 , value: val3

Sieh auch: enumerate in der Python Dokumentation.

Inhalt eines Dictionaries löschen

dict.clear()

Dictionary kopieren

dict_copy = dict.copy()

Achtung: es wird eine sogenannte shallow copy erzeugt!

D.h.: es werden die einzelnen Werte (Objekte) kopiert - genauer gesagt: es werden die Referenzen auf die Objekte kopiert. Ist ein Objekt mutable (veränderbar - z.B. eine Liste), dann führt eine Änderung an so einem Wert zu einer Änderungen im Original und in der Kopie. Sind alle Werte im Dictionary immutable (unveränderbar), dann reicht diese Art der Kopie aus.

Eine vollständige Kopie kann man mit der Funktion deepcopy erzeugen Aufruf

import copy
dict_copy = copy.deepcopy(dict)

Einfügen eines Dictionaries

dict.update(dict2)

Alle Key/Value Paare aus dem Dictionary dict2 werden in das Dictionary dict eingefügt. Ist der Key bereits in dict enthalten, wird der Wert durch den Wert aus dem Dictionary dict2 ersetzt.

Alternativ kann man als Ergebnis auch ein neues Dictionary anlegen:

dict_merge = { **dict1, **dict2 }

Funktionen als Werte in einem Dictionary

Da Funktionen in Python auch Objekte sind, kann man Funktionen auch als Werte in einem Dictionary verwenden.

Ein einfaches Beispiel hierzu ist in der Source [dict_funcs.py]{:target="blank"}

abgelegt.

Dictionary Comprehension

Dictionary Comprehension bietet eine verkürzte Syntax zur Erzeugung, Transformation und Filterung von Dictionaries.

Beispiel: Erzeuge ein Dictionary, das als Schlüssel (Key) die Werte 1 bis 10 enthält. Die zugehörigen Werte (Values) sollen die jeweilige Zweierpotenz sein.

zweier_potenzen = {}

for n in range(1, 11):
    zweier_potenzen[n] = 2**n

zweier_potenzen
## {1: 2, 2: 4, 3: 8, 4: 16, 5: 32, 6: 64, 7: 128, 8: 256, 9: 512, 10: 1024}

Beispiel: ein Dictionary enthält als Schlüssel englische Wörter und als Wert die jeweilige deutsche Übersetzung.

Nutze dieses Dictionary um einen englischen Satz Wort für Wort ins Deutsche zu übersetzen. Ist ein englisches Wort nicht bekannt, wird "???" ausgegeben.

woerterbuch = {
    'we':'wir',
    'they':'sie',
    'love':'lieben',
    'drink':'trinken',
    'eat':'essen',
    'cake':'kuchen',
    'pears':'birnen',
    'juice':'saft'
}

satz = "we love cake"
" ".join(list(map(lambda w: woerterbuch.get(w, "???"), satz.split())))
## wir lieben kuchen

satz = "they eat pears"
" ".join(list(map(lambda w: woerterbuch.get(w, "???"), satz.split())))
## sie essen birnen

Beispiel: Spiegel den Inhalt eines Dictionaries. D.h.: die Schlüssel werden zu Werten und die Werte zu Schlüsseln.

d = {'a':1, 'b':2, 'c':3}
d
## {'a': 1, 'b': 2, 'c': 3}
d_gespiegelt = { val:key for key,val in d.items() }
d_gespiegelt
## {1: 'a', 2: 'b', 3: 'c'}