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.