Arbeiten mit Dictionaries

Einführung

Getränke Verkaufsautomat

Für die Bearbeitung dieses Kapitel unseres Python-Tutorials nehmen war an, dass man mit den Grundbegriffen der Python-Dictionaries und der while-Schleife bereits vertraut ist, so wie wir sie in den Kapitelen Dictionaries and Schleifen behandelt hatten.

Wir haben dieses Kapitel aufgenommen, um den Lernenden zusätzliche Übungen mit sowohl Dictionaries als auch While-Schleifen bereitzustellen. Der Fokus liegt auf verschachtelten Wörterbüchern, in unseren Beispielen auf Dictionaries mit Unterdictionaries. Aus den Erfahrungen meiner Kurse weiß ich, dass dies oft besondere Schwierigkeiten für Anfängerinnen und Anfänger verursacht.

In diesem Kapitel geht es auch um Kaffee, Tee und andere Heißgetränke, deren Konsum wir mittels Python-Dictionaries verwalten.

Im ersten Beispiel starten wir mit einem Dictionary mit drei Personen als Keys. Die Werte entsprechen der Anzahl von getrunkenen Kaffeetassen:

Coffee, Dictionary and a Loop

kaffeeliste = {"Peter": 0, 
               "Eva": 0, 
               "Franka": 0}
while True:
    name = input("Name: ")
    if name == "":
        break
    if name not in kaffeeliste:
        print("Diese Person kenne ich nicht!")
        continue
    kaffeeliste[name] += 1
    print(kaffeeliste[name])
    
print("kaffeeliste: ", kaffeeliste)
1
Diese Person kenne ich nicht!
1
2
kaffeeliste:  {'Peter': 2, 'Eva': 0, 'Franka': 1}

Wir dürfen natürlich nicht die Teetrinker vergessen. Deshalb erweitern wir unser Python-Programm um eine Liste für den Teekonsum:

kaffeeliste = {"Peter": 0, 
               "Eva": 0, 
               "Franka": 0}
teeliste = {"Peter": 0, 
            "Eva": 0, 
            "Franka": 0}
while True:
    name = input("Name: ")
    if name == "":
        break
    if name not in kaffeeliste:
        print("Diese Person kenne ich nicht!")
        continue
    getränk = input("Getränk (Kaffee/Tee): ")
    if getränk.lower() == "kaffee":
        kaffeeliste[name] += 1
        print(kaffeeliste[name])
    elif getränk.lower() == "tee":
        teeliste[name] += 1
        print(teeliste[name])
    else:
        print("Unbekanntes Getränk!")
        
print("Kaffeeliste: ", kaffeeliste)
print("Teeliste: ", teeliste)
1
Unbekanntes Getränk!
1
2
1
Kaffeeliste:  {'Peter': 1, 'Eva': 0, 'Franka': 1}
Teeliste:  {'Peter': 0, 'Eva': 2, 'Franka': 0}

Obiger Programmierstil eignet sich nicht, wenn wir weitere Getränke aufnehmen wollen. Wir bräuchten jedesmal eine eigene Liste. Es ist bedeutend besser eine Unterliste mit den Getränken zu verwenden:

getränkekonsum = {"Peter": {"Tee": 0, 
                           "Kaffee": 0}, 
                  "Eva": {"Tee": 0, 
                         "Kaffee": 0}, 
                  "Franka": {"Tee": 0, 
                            "Kaffee": 0}}
while True:
    name = input("Name: ").capitalize()
    if name == "":
        break
    if name not in getränkekonsum:    # gibt keinen Key "name"
        antwort = input("Sollen wir " + name + " in Liste aufnehmen? (j/n)")
        if antwort in ["j", "ja", "Ja", "y"]:
            getränkekonsum[name] = {"Tee": 0, "Kaffee": 0}
        else:
            print("Dann gibt's nichts zu trinken für " + name + "!")
            continue
    getränk = input("Getränk (Kaffee/Tee): ").capitalize()
    if getränk in getränkekonsum[name]:
        getränkekonsum[name][getränk] += 1
    else:
        print("Sorry, dieses Getränk führen wir nicht!")
print(getränkekonsum)
Sorry, dieses Getränk führen wir nicht!
{'Peter': {'Tee': 1, 'Kaffee': 1}, 'Eva': {'Tee': 1, 'Kaffee': 0}, 'Franka': {'Tee': 0, 'Kaffee': 0}, 'Swen': {'Tee': 1, 'Kaffee': 0}}

Das vorige Beispiel verallgemeinern wir noch weiter, um einfacher ein solches Dictionary aufbauen zu können. Das print haben wir eingebaut, dass man leichter verfolgen kann, wie dieses Dictionary mittels for-Schleifen aufgebaut wird:

getränke = ["Tee", "Kaffee", "Kakao", "Gemüsebrühe"]
namen = ["Peter", "Eva", "Sarah", "Eddie", "Swen"]
getränkekonsum = {}
for name in namen:
    getränkekonsum[name] = {}
    print(getränkekonsum)
    for getränk in getränke:
        getränkekonsum[name][getränk] = 0
{'Peter': {}}
{'Peter': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Eva': {}}
{'Peter': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Eva': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Sarah': {}}
{'Peter': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Eva': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Sarah': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Eddie': {}}
{'Peter': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Eva': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Sarah': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Eddie': {'Tee': 0, 'Kaffee': 0, 'Kakao': 0, 'Gemüsebrühe': 0}, 'Swen': {}}

Aufgaben

Aufgabe 1

Gegen sei ein kleiner Supermarkt mit folgenden Produkten. Der Inhaber des Supermarktes möchte gerne wissen, wie hoch der Verkaufswert aller seiner Produkte zusammengerechnet beträgt. Schreibe dazu ein Python-Programm:

supermarket = {"milk": {"quantity": 20, "price": 1.19},
               "biscuits":  {"quantity": 32, "price": 1.45},
               "butter":  {"quantity": 20, "price": 2.29},
               "cheese":  {"quantity": 15, "price": 1.90},
               "bread":  {"quantity": 15, "price": 2.59},
               "cookies":  {"quantity": 20, "price": 4.99},
               "yogurt": {"quantity": 18, "price": 3.65},
               "apples":  {"quantity": 35, "price": 3.15},
               "oranges":  {"quantity": 40, "price": 0.99},
               "bananas": {"quantity": 23, "price": 1.29}}

Lösungen

Aufgabe 1

total_value = 0
for article, numbers in supermarket.items():
    quantity = numbers["quantity"]
    price = numbers["price"]
    product_price = quantity * price
    article = article + ':'
    print(f"{article:15s} {product_price:08.2f}")
    total_value += product_price
print("="*24)   
print(f"Gesamtsumme:    {total_value:08.2f}")
    
milk:           00023.80
biscuits:       00046.40
butter:         00045.80
cheese:         00028.50
bread:          00038.85
cookies:        00099.80
yogurt:         00065.70
apples:         00110.25
oranges:        00039.60
bananas:        00029.67
========================
Gesamtsumme:    00528.37