mitmario.dev

Rechnen mit Listen

Python Sandbox 4 Min Lesezeit 6 BeispieleLektion 4 von 8

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

Eine Woche Kaffee in vier Zeilen
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

Wo steht der Höchstwert
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

Sortiert, und das Original bleibt
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

sort ändert die Liste selbst
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

Wörter und Ziffern sortieren
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

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, kostenlos

Zu 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.