Abschnitt 5 · Lektion 4
Rechnen mit Listen
Fünf Tage Kaffee. Du willst wissen, was sie zusammen gekostet haben und welcher Tag der teuerste
war. In Lektion 4.3 waren dafür drei Schleifen nötig, eine für die Summe, eine für den teuersten Tag
und eine, die zeigte, wie man es falsch macht. Die Beträge kamen damals einzeln aus input(), und
anders als mit einer Schleife ließen sie sich nicht zusammenbringen.
Wenn sie in einer Liste liegen, sind die häufigsten Fragen an sie eine Zeile lang.
Vier Fragen, vier Aufrufe
kaffee = [3.20, 0, 2.90, 3.20, 4.50]
print(f"Zusammen: {sum(kaffee):.2f} Euro")
print(f"Am teuersten: {max(kaffee):.2f} Euro")
print(f"Am billigsten: {min(kaffee):.2f} Euro")
print(f"Im Schnitt: {sum(kaffee) / len(kaffee):.2f} Euro") sum() zählt alle Einträge zusammen. max() sucht den größten, min() den kleinsten, und len()
kennst du schon. Alle vier sind eingebaute Funktionen (built-in functions), so wie print. Sie
nehmen die ganze Liste und geben einen einzigen Wert zurück.
Für den Durchschnitt gibt es keine eingebaute Funktion. Er ist einfach sum(kaffee) / len(kaffee),
die Summe geteilt durch die Anzahl.
Für die Anzahl steht dort len() und nicht die 5, die man gerade abgezählt hat. Wenn nächste Woche
ein sechster Tag dazukommt, stimmt len() von selbst. Die 5 dagegen rechnet still einen falschen
Schnitt aus.
Die Muster mit der Schleife sind damit nicht überflüssig. Sobald die Frage „wie viel zusammen, aber
nur an den Tagen mit Kuchen“ heißt, reicht sum() allein nicht mehr. Wie man aussiebt, kommt beim
Umbauen von Listen.
Wo der Höchstwert steht
kaffee = [3.20, 0, 2.90, 3.20, 4.50]
tage = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag"]
position = kaffee.index(max(kaffee))
print(position)
print("Am teuersten war der", tage[position])
print(kaffee.index(3.20)) Mit max() weißt du, wie teuer der teuerste Tag war. Welcher Tag es war, weißt du noch nicht. Dafür
gibt es die Methode index(). kaffee.index(4.50) sucht den Wert in der Liste und gibt seine
Position zurück. Steckt man max(kaffee) hinein, bekommt man die Position des Höchstwerts, hier 4.
Für den Namen des Tages braucht es eine zweite Liste, in der die Tage in derselben Reihenfolge
stehen. Position 4 in kaffee ist Position 4 in tage, also der Freitag. So arbeiten zwei Listen
zusammen, die nebeneinander herlaufen, und so brauchst du es auch in der Aufgabe.
Kommt ein Wert mehrmals vor, liefert index() die erste Stelle. Die 3,20 Euro gab es am Montag und
am Donnerstag, und in der letzten Zeile im Beispiel steht 0, der Montag. Fehlt der Wert ganz, bricht
index() mit einem ValueError ab. Bei remove war es ähnlich.
Sortieren mit sorted
preise = [4.50, 2.90, 3.20, 0.99]
print(sorted(preise))
print(sorted(preise, reverse=True))
print(preise) sorted() gibt eine neue Liste zurück, in der alles der Größe nach steht, das Kleinste zuerst. Mit
reverse=True (umgekehrt) kommt das Größte zuerst. Die alte Liste bleibt dabei, wie sie war. In der
letzten Zeile siehst du sie in der Reihenfolge, in der sie geschrieben wurde.
Vielleicht fällt dir auf, dass hier 2.9 steht und nicht 2.90. Python schreibt eine Kommazahl
immer so kurz wie möglich, ohne Nullen am Ende. Auch print(2.90) gibt 2.9. Für den Bon nimmst du
weiter :.2f, dann steht ein Preis mit zwei Stellen da. Das geht aber nur für einzelne Werte und
nicht für eine ganze Liste.
Sortieren mit sort
preise = [4.50, 2.90, 3.20, 0.99]
preise.sort()
print(preise)
ergebnis = preise.sort()
print(ergebnis) Die Methode sort() sortiert auch, nur anders. Sie ändert die Liste selbst und gibt None zurück,
genau wie append. Danach ist die alte Reihenfolge weg. Wer ergebnis = preise.sort() schreibt,
hat in ergebnis also kein sortiertes Ergebnis, sondern None.
sorted(liste) lässt das Original stehen, liste.sort() nicht. Wenn du die ursprüngliche
Reihenfolge noch brauchst, nimmst du sorted. Und die braucht man öfter, als man denkt. Hängt an
der Reihenfolge eine zweite Liste wie die Tage im Beispiel davor, dann zeigt nach einem sort jede
Position auf den falschen Tag.
Wörter und Ziffern
print(sorted(["Zitrone", "apfel", "Äpfel", "Birne", "Banane"]))
print(sorted(["10", "9", "100", "25"]))
print(sorted([10, 9, 100, 25])) Text sortiert Python nach der Zeichentabelle des Computers, und die passt nur ungefähr zum Alphabet.
Die Großbuchstaben von A bis Z stehen vor allen Kleinbuchstaben. Deshalb kommt apfel hinter
Zitrone. Umlaute stehen noch weiter hinten, groß wie klein, und die Äpfel landen ganz am Ende.
Für eine Liste mit deutschen Wörtern ist das ärgerlich. Wie man Python eine eigene Reihenfolge
beibringt, zeigt Lektion 8.7.
Tückischer ist die zweite Zeile. Zahlen, die als Text in einer Liste stehen, werden Zeichen für
Zeichen sortiert, und "100" kommt vor "25", weil die 1 vor der 2 steht. Das passiert schnell,
denn alles, was aus input() oder einer Datei kommt, ist erst einmal Text. In der dritten Zeile
stehen dieselben Zahlen als Zahlen, und da stimmt die Reihenfolge. Wer Zahlen sortieren will,
wandelt sie also vorher mit int() oder float() um.
Wenn die Liste leer ist
ausgaben = []
print(sum(ausgaben), len(ausgaben))
print(max(ausgaben)) Eine leere Liste hat die Summe 0 und die Länge 0. Das geht noch gut. max() bricht dagegen mit
einem ValueError ab, unter Python 3.14 mit max() iterable argument is empty, weil es in einer
leeren Liste keinen größten Eintrag gibt. Ein Durchschnitt wäre 0 geteilt durch 0. Also ein
ZeroDivisionError. Wo eine Liste leer sein kann, fragt man deshalb vorher mit if ausgaben:, ob
etwas drin ist.
Was die Aufgabe will
Ein Stromzähler ist seit Januar jeden Monat abgelesen worden. Die Werte kommen aus einer Datei, die der Startcode einliest, und daneben steht eine Liste mit den Namen der Monate. Gefragt sind Summe und Durchschnitt. Dazu der Monat mit dem höchsten und der mit dem niedrigsten Verbrauch.
Zum Mitnehmen
sum, max, min und len stellen jeweils eine Frage an die ganze Liste und brauchen dafür nur einen Aufruf. Den Durchschnitt bekommst du mit sum geteilt durch len. sorted liefert eine neue, sortierte Liste, während sort die alte umstellt und nichts zurückgibt.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 6 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.