Objektsammlungen mit Dictionaries

https://oer-informatik.de/python_dictionary

tl/dr; (ca. 8 min Lesezeit): Häufig wollen wir Werte nicht in einzelnen Variablen speichern, sondern als zusammenhängende Struktur. Immer dann, wenn wir Key-Value-Beziehungen haben (wir also über einen bestimmten Namen auf einen Wert zugreifen wollen) sind Dictionaries die Objektsammlung der Wahl.

Dictionaries sind in Python ungeordnete, veränderliche und dynamische Objektsammlungen, in denen Werte und zugehörige Schlüssel abgespeichert werden. In anderen Programmiersprachen werden vergleichbare Datentypen häufig auch als Map oder assoziative Arrays bezeichnet.

Jedem Schlüsselwert (key) ist genau ein Datenwert (value) zugeordnet.

key \rightarrow value

Kennzeichnend für Dictionaries sind die in geschweiften Klammern gefassten Wertpaar-Auflistungen bei Instanziierung und Initialisierung. Schlüssel und Wert werden durch Doppelpunkte getrennt, die unterschiedlichen Schlüssel/Wert-Paare durch Kommata voneinander abgegrenzt. In der Python-Shell können die folgenden Beispiele direkt ohne umgebendes Programm getestet werden.

Leere Dictionaries werden nur mit geschweiften Klammern notiert:

Um sicher zu gehen, dass es sich bei person um ein dict handelt kann in der Python-Shell mit Hilfe der type()-Funktion der Datentyp ermittelt werden:

Der Zugriff (lesend wie schreibend) erfolgt über den in eckigen Klammern geschriebenen Schlüssel. Diese können Zeichenkennten vom Typ str sein, es können aber ebenso andere Datentypen genutzt werden.

Über diese Schreibweise können auch neue Schlüssel/Wert-Paare an das Dictonary angefügt werden, da diese Objektsammlung dynamisch ist, das heißt, dass sie zur Laufzeit des Programms wachsen/schrumpfen kann:

Die Werte eines Dictionaries können auch direkt inkrementiert werden:

(erneut der Hinweis: der ++-Operator, der aus anderen Programmiersprachen bekannt ist, existiert in Python nicht.)

Über print(person) können alle Eigenschaften von person angezeigt werden, die Python-Shell gibt aber auch bei Eingabe des Variablennamens die Informationen preis:

Iteration durch ein Dictionary

Um systematisch durch alle Schlüssel/Wert-Paare hindurch zu iterieren bietet Python eine besondere zählergesteuerte Schleife an, die jedes Paar genau einmal aufruft (in anderen Programmiersprachen entspricht das for each-Konstrukten). Jeder Schlüssel kann aufgerufen werden über:

Ausgabe:

Vorname
Nachname
Alter

Dictionaries garantieren keine Reihenfolge in der Bearbeitung. Um trotzdem eine alphabetische Reihenfolge auszugeben kann die Funktion sorted() verwendet werden.

Ausgabe:

Alter
Nachname
Vorname

Natürlich kann bei bekanntem Schlüssel dann auch der Wert ergänzt werden. Da es sich aber ggf. nicht um einen String handelt (wie zum Beispiel bei Alter) muss der Wert für die Ausgabe mit der Funktion str() in einen String umgewandelt werden:

Ausgabe:

Alter: 45
Nachname: Müller
Vorname: Herbert

Mit Hilfe der Methode items() lassen sich direkt Schlüssel/Wert-Paare für die Iteration bilden, was die Schreibweise erleichtert:

(Ausgabe wie oben)

Dictionaries auf Inhalt überprüfen

Wird versucht, auf ein Schlüssel/Wert-Paar zuzugreifen, dass gar nicht existiert, so gibt das Programm einen KeyError zurück:

Daher muss häufig in Programmen überprüft werden, ob zu einem bestimmten Schlüssel ein Wert hinterlegt wurde. Der Zugriff auf den Wert darf nur erfolgen, wenn dieser Wert existiert:

Sofern in jedem Fall ein Wert ausgegeben werden soll (auch wenn zu dem übergebenen Schlüssel kein Eintrag existiert) kann die get()-Methode des Dictionaries verwendet werden. Dieser Methode kann ein default-Wert übergeben werden (hier: ‘N/A’ für ‘not available’/‘nicht verfügbar’)

Der selbe Aufruf führt bei gesetztem Wert zur Ausgabe des Wertes:

Eine Überprüfung ist insbesondere auch erforderlich, wenn wir bei Schlüsseln Zählerwerte inkrementieren wollen, die bislang gar nicht gesetzt waren. Soll die Anzahl der Kinder erhöht werden bei einer Person, für die zu diesem Schlüssel bislang gar kein Wert gesetzt wurde, wird analog zu oben eine Fehlermeldung ausgegeben:

Diese lässt sich verhindern, in dem über eine bedingte Anweisung zuvor festgestellt wird, ob der Schlüssel bekannt ist. Andernfalls wird ein Defaultwert/Startwert gesetzt:

Auch hierfür bietet ein Dictionary eine Methode, die genau diesen Defautlwert (hier 0) setzt:

Weitere Methoden von Dictionary

Eine Reihe von Methodem der Klasse dict haben wir schon kennengelernt, Python bietet eine Reihe weiterer Methodden an. Die wichtigsten finden sich mit einer kurzen Erklärung in diesem UML-Klassendiagramm:

UML-Klassendiagramm für Dict
UML-Klassendiagramm für Dict

Eine Erklärung zu dict und deren Methoden und Attribute erhält man in der Python-Shell über:

Wenn eine Liste der Methoden und Attribute reicht, dann bietet der dir()-Befehl die nötige Übersicht.

Um konkrete Hilfe zu einzelnen Methoden zu bekommen können diese auch direkt mit help() adressiert werden:

Type Annotations

Um Dictionaries und deren Elemente mit Kommentaren zu deren erwarteten Datentypen zu versehen, können Type-Annotations genutzt werden. Im Gegensatz zu den einfachen Annotations müssen die jedoch zuvor importiert werden:

Danach wird Dict (im Gegensatz zum Datentyp wird die Annotation in Großbuchstaben geschrieben!) und die Datentypen der Schlüssel/Wertpaare folgendermaßen angegeben:

Rückgabewerte von Funktionen können entsprechend notiert werden:

Die Type Annotation sind wie Kommentare zu verstehen, wir können sie jederzeit im Programm missachten, ohne dass der Interpreter dies moniert:

Quellen und offene Ressourcen (OER)

Die Ursprungstexte (als Markdown), Grafiken und zugrunde liegende Diagrammquelltexte finden sich (soweit möglich in weiterbearbeitbarer Form) in folgendem git-Repository:

https://gitlab.com/oer-informatik/python-basics/erste-schritte-mit-python

Sofern nicht explizit anderweitig angegeben sind sie zur Nutzung als Open Education Resource (OER) unter Namensnennung (H. Stein, oer-informatik.de) freigegeben gemäß der Creative Commons Namensnennung 4.0 International Lizenz (CC BY 4.0).

Creative Commons Lizenzvertrag


Hinweis zur Nachnutzung

Dieses Werk und dessen Inhalte sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Erste Schritte mit Python” von Hannes Stein, Lizenz: CC BY 4.0. Die Quellen dieses Werks sind verfügbar auf GitLab.

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: