7.3 Dictionaries#
Häufig müssen Daten strukturiert gespeichert werden. Beispielsweise sollen Maschinenkonfigurationen effizient verwaltet werden. Für solche Fälle gibt es eine Datenstruktur, die besser als eine Liste geeignet ist, das sogenannte Dictionary.
Lernziele#
Lernziele
Sie können Dictionary-Objekte mit Schlüssel und Wert anlegen und verstehen die grundlegende Syntax {key: value}.
Sie beherrschen den Zugriff auf Werte über ihre Schlüssel und können überprüfen, ob bestimmte Schlüssel in einem Dictionary vorhanden sind.
Sie können neue Schlüssel-Wert-Paare hinzufügen, bestehende Werte aktualisieren und Einträge aus einem Dictionary entfernen.
Sie kennen und nutzen die wichtigsten Methoden wie
.keys()
,.values()
,.items()
und.get()
für effiziente Operationen.Sie können durch Schlüssel, Werte oder Schlüssel-Wert-Paare eines Dictionaries iterieren und diese in Schleifen verarbeiten.
Grundlagen von Dictionaries#
Dictionaries (deutsch: Wörterbücher) sind eine der wichtigsten Datenstrukturen in Python. Sie speichern Daten in Form von Schlüssel-Wert-Paaren (key-value pairs), wobei jeder Schlüssel eindeutig sein muss. Wir können uns ein Dictionary wie ein technisches Handbuch vorstellen: Wir schlagen einen Begriff (Schlüssel) nach und erhalten die zugehörige Information (Wert).
Ein Dictionary ist eine veränderbare, ungeordnete Sammlung von Schlüssel-Wert-Paaren. Im Gegensatz zu Listen, die über einen numerischen Index angesprochen werden, erfolgt der Zugriff bei Dictionaries über beliebige unveränderliche Objekte als Schlüssel (meist Strings oder Zahlen).
stahl = {
"Werkstoffnummer": "1.4301",
"Dichte": 7900, # kg/m³
"E-Modul": 200000, # MPa
"Streckgrenze": 190 # MPa
}
print(stahl)
{'Werkstoffnummer': '1.4301', 'Dichte': 7900, 'E-Modul': 200000, 'Streckgrenze': 190}
Dictionaries werden mit geschweiften Klammern {}
erstellt. Die
Schlüssel-Wert-Paare werden durch Doppelpunkte :
getrennt, mehrere Paare durch
Kommas ,
.
# Verschiedene Möglichkeiten der Dictionary-Erstellung
# 1. Direkte Erstellung
motor = {"Typ": "V6", "Leistung": 250, "Hubraum": 3.0}
# 2. Leeres Dictionary erstellen und befüllen
getriebe = {}
getriebe["Typ"] = "Automatik"
getriebe["Gänge"] = 8
# 3. Mit der dict()-Funktion
reifen = dict(Breite=225, Verhältnis=45, Durchmesser=17)
print("Motor:", motor)
print("Getriebe:", getriebe)
print("Reifen:", reifen)
Motor: {'Typ': 'V6', 'Leistung': 250, 'Hubraum': 3.0}
Getriebe: {'Typ': 'Automatik', 'Gänge': 8}
Reifen: {'Breite': 225, 'Verhältnis': 45, 'Durchmesser': 17}
Der Zugriff auf Werte erfolgt über die Angabe des Schlüssels in eckigen Klammern:
# Zugriff auf einzelne Werte
print("Motorleistung:", motor["Leistung"], "kW")
print("Anzahl Gänge:", getriebe["Gänge"])
print("Reifenbreite:", reifen["Breite"], "mm")
# Ändern von Werten
motor["Leistung"] = 265
print("Neue Motorleistung:", motor["Leistung"], "kW")
Motorleistung: 250 kW
Anzahl Gänge: 8
Reifenbreite: 225 mm
Neue Motorleistung: 265 kW
Im Gegensatz zu Listen, die über numerische Indizes (0, 1, 2, …) angesprochen werden, verwenden Dictionaries aussagekräftige Schlüssel:
# Vergleich: Liste vs. Dictionary
# Als Liste (unübersichtlich)
werkstoff_liste = ["1.4301", 7900, 200000, 190]
print("Dichte (Liste):", werkstoff_liste[1]) # Was bedeutet Index 1?
# Als Dictionary (selbsterklärend)
werkstoff_dict = {
"Werkstoffnummer": "1.4301",
"Dichte": 7900,
"E-Modul": 200000,
"Streckgrenze": 190
}
print("Dichte (Dictionary):", werkstoff_dict["Dichte"])
Dichte (Liste): 7900
Dichte (Dictionary): 7900
Mini-Übung
Erstellen Sie ein Dictionary für die Eigenschaften von Aluminium mit folgenden Daten:
Werkstoffnummer: “3.1645”
Dichte: 2700 kg/m³
E-Modul: 70000 MPa
Streckgrenze: 160 MPa
Wärmeleitfähigkeit: 140 W/(m·K)
Greifen Sie dann auf die Dichte und die Wärmeleitfähigkeit zu und geben Sie diese mit passenden Einheiten aus.
# Hier Ihr Code
Lösung
# Dictionary für Aluminium erstellen
aluminium = {
"Werkstoffnummer": "3.1645",
"Dichte": 2700,
"E-Modul": 70000,
"Streckgrenze": 160,
"Wärmeleitfähigkeit": 140
}
# Zugriff auf spezifische Eigenschaften
print("Dichte von Aluminium:", aluminium["Dichte"], "kg/m³")
print("Wärmeleitfähigkeit:", aluminium["Wärmeleitfähigkeit"], "W/(m·K)")
Arbeiten mit Dictionaries#
In diesem Abschnitt betrachten wir, wie Dictionaries dynamisch verändert, durchsucht und mit verschiedenen Methoden effizient bearbeitet werden können.
Dictionaries sind veränderbar. Wir können jederzeit neue Einträge hinzufügen oder bestehende entfernen:
# Dictionary für eine Hydraulikpumpe
pumpe = {
"Typ": "Axialkolbenpumpe",
"Volumenstrom": 120, # l/min
"Druck": 250 # bar
}
# Neue Einträge hinzufügen
pumpe["Drehzahl"] = 1450 # U/min
pumpe["Wirkungsgrad"] = 0.92
print("Erweiterte Pumpendaten:", pumpe)
# Eintrag löschen mit del
del pumpe["Wirkungsgrad"]
print("Nach Löschen:", pumpe)
# Eintrag löschen mit pop() - gibt den Wert zurück
drehzahl = pumpe.pop("Drehzahl")
print("Entfernte Drehzahl:", drehzahl)
print("Finale Pumpendaten:", pumpe)
Erweiterte Pumpendaten: {'Typ': 'Axialkolbenpumpe', 'Volumenstrom': 120, 'Druck': 250, 'Drehzahl': 1450, 'Wirkungsgrad': 0.92}
Nach Löschen: {'Typ': 'Axialkolbenpumpe', 'Volumenstrom': 120, 'Druck': 250, 'Drehzahl': 1450}
Entfernte Drehzahl: 1450
Finale Pumpendaten: {'Typ': 'Axialkolbenpumpe', 'Volumenstrom': 120, 'Druck': 250}
Bevor Sie auf einen Schlüssel zugreifen, sollten wir prüfen, ob er existiert:
# Maschinenkonfiguration
maschine = {
"Modell": "DMG MORI DMU 50",
"Achsen": 5,
"Arbeitsraum_X": 500,
"Arbeitsraum_Y": 450
}
# Prüfen, ob Schlüssel existiert
if "Arbeitsraum_Z" in maschine:
print("Z-Achse:", maschine["Arbeitsraum_Z"])
else:
print("Z-Achse nicht definiert")
maschine["Arbeitsraum_Z"] = 400
# Negative Prüfung
if "Spindeldrehzahl" not in maschine:
maschine["Spindeldrehzahl"] = 12000 # U/min
print("Vollständige Maschinendaten:", maschine)
Z-Achse nicht definiert
Vollständige Maschinendaten: {'Modell': 'DMG MORI DMU 50', 'Achsen': 5, 'Arbeitsraum_X': 500, 'Arbeitsraum_Y': 450, 'Arbeitsraum_Z': 400, 'Spindeldrehzahl': 12000}
Python bietet mehrere nützliche Methoden für die Arbeit mit Dictionaries:
# Werkzeugdaten für Fräswerkzeuge
werkzeuge = {
"VHM_Schaftfraeser_6mm": {"Durchmesser": 6, "Zaehne": 4, "Material": "VHM"},
"HSS_Bohrer_8mm": {"Durchmesser": 8, "Material": "HSS-E"},
"Planfraeser_50mm": {"Durchmesser": 50, "Zaehne": 5, "Material": "HM"}
}
# keys() - alle Schlüssel abrufen
print("Verfügbare Werkzeuge:")
for werkzeug in werkzeuge.keys():
print("-", werkzeug)
# values() - alle Werte abrufen
print("\nWerkzeugdetails:")
for details in werkzeuge.values():
print(details)
# items() - Schlüssel-Wert-Paare abrufen
print("\nKomplette Werkzeugliste:")
for name, eigenschaften in werkzeuge.items():
print(f"{name}: {eigenschaften}")
Verfügbare Werkzeuge:
- VHM_Schaftfraeser_6mm
- HSS_Bohrer_8mm
- Planfraeser_50mm
Werkzeugdetails:
{'Durchmesser': 6, 'Zaehne': 4, 'Material': 'VHM'}
{'Durchmesser': 8, 'Material': 'HSS-E'}
{'Durchmesser': 50, 'Zaehne': 5, 'Material': 'HM'}
Komplette Werkzeugliste:
VHM_Schaftfraeser_6mm: {'Durchmesser': 6, 'Zaehne': 4, 'Material': 'VHM'}
HSS_Bohrer_8mm: {'Durchmesser': 8, 'Material': 'HSS-E'}
Planfraeser_50mm: {'Durchmesser': 50, 'Zaehne': 5, 'Material': 'HM'}
Es gibt verschiedene Möglichkeiten, über ein Dictionary zu iterieren:
# Materialdatenbank
materialien = {
"Stahl": {"Dichte": 7850, "E_Modul": 210000, "Preis_kg": 1.50},
"Aluminium": {"Dichte": 2700, "E_Modul": 70000, "Preis_kg": 3.20},
"Titan": {"Dichte": 4500, "E_Modul": 110000, "Preis_kg": 45.00}
}
# Iteration über Schlüssel (Standard)
print("Materialien in der Datenbank:")
for material in materialien: # äquivalent zu materialien.keys()
print(material)
# Iteration über Werte
print("\nMaterialdichten (kg/m³):")
for eigenschaften in materialien.values():
print(eigenschaften["Dichte"])
# Iteration über Schlüssel-Wert-Paare
print("\nMaterialpreise:")
for material, eigenschaften in materialien.items():
print(f"{material}: {eigenschaften['Preis_kg']} €/kg")
Materialien in der Datenbank:
Stahl
Aluminium
Titan
Materialdichten (kg/m³):
7850
2700
4500
Materialpreise:
Stahl: 1.5 €/kg
Aluminium: 3.2 €/kg
Titan: 45.0 €/kg
Die Methode .get()
ermöglicht sicheren Zugriff mit Standardwerten:
# Lagerdaten
lager = {
"Schrauben_M8": 500,
"Muttern_M8": 480,
"Scheiben_M8": 520
}
# Unsicherer Zugriff (kann Fehler verursachen)
# anzahl = lager["Schrauben_M10"] # KeyError!
# Sicherer Zugriff mit get()
anzahl_m10 = lager.get("Schrauben_M10", 0) # Standardwert 0
print(f"Schrauben M10 im Lager: {anzahl_m10}")
# Mit get() auf vorhandene Werte zugreifen
anzahl_m8 = lager.get("Schrauben_M8", 0)
print(f"Schrauben M8 im Lager: {anzahl_m8}")
Schrauben M10 im Lager: 0
Schrauben M8 im Lager: 500
Mini-Übung
Erstellen Sie ein Dictionary für verschiedene Stahlsorten mit ihren Preisen pro Kilogramm:
S235: 1.20 €/kg
S275: 1.35 €/kg
S355: 1.50 €/kg
Fügen Sie dann S460 mit 1.80 €/kg hinzu. Gehen Sie anschließend mit einer for-Schleife durch alle Einträge und geben aus, welche Stahlsorten teurer als 1.40 €/kg sind.
# Hier Ihr Code
Lösung
:class: miniexercise, toggle
```python
# Dictionary für Stahlsorten erstellen
stahlpreise = {
"S235": 1.20,
"S275": 1.35,
"S355": 1.50
}
# Neue Stahlsorte hinzufügen
stahlpreise["S460"] = 1.80
# Teure Stahlsorten ausgeben
print("Stahlsorten über 1.40 €/kg:")
for stahl, preis in stahlpreise.items():
if preis > 1.40:
print(f"- {stahl}: {preis} €/kg")
Fortgeschrittene Dictionary-Konzepte#
In diesem Abschnitt vertiefen wir unser Wissen über Dictionaries durch verschachtelte Strukturen und erweiterte Methoden für komplexe Anwendungen im Maschinenbau.
Dictionaries können andere Dictionaries als Werte enthalten, was hierarchische Datenstrukturen ermöglicht:
# CNC-Maschinenkonfiguration mit verschachtelten Dictionaries
cnc_maschine = {
"Modell": "DMG MORI NLX 2500",
"Achsen": {
"X": {"Verfahrweg": 300, "Geschwindigkeit": 30, "Beschleunigung": 5},
"Y": {"Verfahrweg": 200, "Geschwindigkeit": 30, "Beschleunigung": 5},
"Z": {"Verfahrweg": 500, "Geschwindigkeit": 24, "Beschleunigung": 4}
},
"Spindel": {
"Max_Drehzahl": 12000,
"Leistung": 30, # kW
"Drehmoment": 250 # Nm
},
"Werkzeugwechsler": {
"Plaetze": 24,
"Wechselzeit": 1.5 # Sekunden
}
}
# Zugriff auf verschachtelte Elemente
print("X-Achse Verfahrweg:", cnc_maschine["Achsen"]["X"]["Verfahrweg"], "mm")
print("Spindelleistung:", cnc_maschine["Spindel"]["Leistung"], "kW")
# Ändern eines verschachtelten Wertes
cnc_maschine["Achsen"]["Z"]["Geschwindigkeit"] = 28
print("Neue Z-Geschwindigkeit:", cnc_maschine["Achsen"]["Z"]["Geschwindigkeit"], "m/min")
X-Achse Verfahrweg: 300 mm
Spindelleistung: 30 kW
Neue Z-Geschwindigkeit: 28 m/min
Für sicheren Umgang mit möglicherweise fehlenden Schlüsseln bieten sich erweiterte Methoden an:
# Maschinenwartungsdaten
wartung = {
"Oelwechsel": "2024-03-15",
"Inspektion": "2024-01-10",
"Kalibrierung": "2024-02-20"
}
# get() mit Standardwert für nicht vorhandene Schlüssel
naechste_wartung = wartung.get("Hauptwartung", "nicht geplant")
print("Nächste Hauptwartung:", naechste_wartung)
# setdefault() - fügt Schlüssel nur hinzu, wenn er nicht existiert
wartung.setdefault("Schmierung", "2024-04-01")
wartung.setdefault("Inspektion", "2024-12-31") # Ändert nichts, da bereits vorhanden
print("\nAktuelle Wartungsliste:")
for art, datum in wartung.items():
print(f"- {art}: {datum}")
Nächste Hauptwartung: nicht geplant
Aktuelle Wartungsliste:
- Oelwechsel: 2024-03-15
- Inspektion: 2024-01-10
- Kalibrierung: 2024-02-20
- Schmierung: 2024-04-01
Ein praktisches Beispiel zeigt, wie verschachtelte Dictionaries zur Verwaltung komplexer Maschinenkonfigurationen verwendet werden:
# Werkzeugmagazin einer Fräsmaschine
werkzeugmagazin = {
"Platz_1": {
"Typ": "Schaftfraeser",
"Durchmesser": 10,
"Material": "VHM",
"Standzeit": 120 # Minuten
},
"Platz_2": {
"Typ": "Bohrer",
"Durchmesser": 8.5,
"Material": "HSS",
"Standzeit": 80
},
"Platz_3": {
"Typ": "Gewindebohrer",
"Durchmesser": 6,
"Material": "HSSE",
"Standzeit": 60
}
}
# Übersicht über alle Werkzeuge
print("Werkzeugmagazin-Übersicht:")
for platz, werkzeug in werkzeugmagazin.items():
print(f"\n{platz}:")
print(f" Typ: {werkzeug['Typ']}")
print(f" Durchmesser: {werkzeug['Durchmesser']} mm")
print(f" Reststandzeit: {werkzeug['Standzeit']} min")
Werkzeugmagazin-Übersicht:
Platz_1:
Typ: Schaftfraeser
Durchmesser: 10 mm
Reststandzeit: 120 min
Platz_2:
Typ: Bohrer
Durchmesser: 8.5 mm
Reststandzeit: 80 min
Platz_3:
Typ: Gewindebohrer
Durchmesser: 6 mm
Reststandzeit: 60 min
Mini-Übung
Erstellen Sie ein verschachteltes Dictionary für eine einfache Werkzeugmaschine mit:
Name: “Drehbank DL-200”
Zwei Achsen (X und Z) mit jeweils:
Verfahrweg in mm
Aktuelle Position in mm
Spindeldaten mit:
Maximale Drehzahl
Aktuelle Drehzahl
Geben Sie dann die aktuelle Position beider Achsen aus.
# Hier Ihr Code
Lösung
# Werkzeugmaschine als verschachteltes Dictionary
drehbank = {
"Name": "Drehbank DL-200",
"Achsen": {
"X": {
"Verfahrweg": 150,
"Aktuelle_Position": 75.5
},
"Z": {
"Verfahrweg": 500,
"Aktuelle_Position": 250.0
}
},
"Spindel": {
"Max_Drehzahl": 3000,
"Aktuelle_Drehzahl": 1500
}
}
# Ausgabe der aktuellen Positionen
print(f"Aktuelle Positionen der {drehbank['Name']}:")
print(f"X-Achse: {drehbank['Achsen']['X']['Aktuelle_Position']} mm")
print(f"Z-Achse: {drehbank['Achsen']['Z']['Aktuelle_Position']} mm")
Zusammenfassung#
Dictionaries sind eine essenzielle Datenstruktur in Python für die Verwaltung von Schlüssel-Wert-Paaren. Sie bieten schnellen Zugriff über aussagekräftige Bezeichner statt numerischer Indizes.