python
# 1: bezahlte Summe
bezahlt_summe = sum(b['betrag'] for b in bestellungen if b['bezahlt'])
# 2: Kunden mit offenen Bestellungen
offen = sorted({b['kunde'] for b in bestellungen if not b['bezahlt']})
# 3: Umsatz pro Kunde
umsatz = {}
for b in bestellungen:
umsatz[b['kunde']] = umsatz.get(b['kunde'], 0) + b['betrag']
# 4: nummerierte Ausgabe
for nr, b in enumerate(bestellungen, start=1):
print(f'{nr}. {b["kunde"]:<6}{b["betrag"]:>8.2f}')
print(bezahlt_summe) # 150.0
print(offen) # ['Ben', 'Cem']
print(umsatz) # {'Anna': 150.0, 'Ben': 45.5, 'Cem': 210.0}
Was passiert:
- Zu 1: Der Generator-Ausdruck läuft über alle Bestellungen, filtert mit
if b['bezahlt']und liefert die Beträge ansum. - Zu 2:
{... for ...}mit geschweiften Klammern ergibt eine Menge, die Duplikate entfernt (Benkäme sonst bei mehreren offenen Bestellungen mehrfach vor).sortedmacht daraus eine alphabetische Liste. - Zu 3: Dasselbe Zählermuster wie in Kapitel 4, nur wird der Betrag statt
1addiert. - Zu 4:
enumerate(..., start=1)liefert Nummer und Bestellung. Im f-String stehtb["kunde"]mit doppelten Anführungszeichen, weil der f-String selbst in einfachen steht.
Warum so: Comprehensions sind kürzer und zeigen die Absicht ("Summe der bezahlten Beträge"). Eine normale Schleife wie bei Punkt 3 ist besser, wenn mehr passiert als ein Filtern oder Umwandeln.