mitmario.dev

Durch eine Liste laufen

Python Sandbox 4 Min Lesezeit 5 BeispieleLektion 3 von 8

Für eine Woche geht es noch, jeden Eintrag einzeln über seine Position zu holen. Für einen Kontoauszug mit zweihundert Buchungen nicht, auch wenn alle Werte unter einem Namen liegen, und meistens will man ohnehin mit jedem Eintrag dasselbe tun. Ausgeben, aufsummieren, prüfen. Die Schleife dafür kennst du schon.

Jeder Eintrag einmal

Jeder Eintrag einmal
einkauf = ["Brot", "Milch", "Eier"]
for sache in einkauf:
    print("-", sache)
print("Fertig.")

for sache in einkauf: funktioniert genau wie for zeichen in text, nur mit Einträgen statt Zeichen. In jeder Runde liegt der nächste Eintrag in sache, vom ersten bis zum letzten. Nach dem letzten ist die Schleife vorbei. Wie viele Runden es werden, musst du nicht wissen. Es sind so viele, wie die Liste lang ist. Bei einer leeren Liste sind es null Runden, und das Programm macht nach der Schleife einfach weiter.

Den Namen nach dem for wählst du selbst. Üblich ist die Einzahl der Liste, for preis in preise, for name in namen. Dann liest sich die Zeile fast wie ein Satz.

Im Reiter Debug siehst du beide Namen nebeneinander. einkauf hat die ganze Liste und ändert sich nie. In sache steht der Eintrag der Runde, erst 'Brot', dann 'Milch', dann 'Eier'.

Zählen, summieren, das Größte finden

Die drei Muster aus Abschnitt 4 funktionieren mit Listen unverändert. for preis in preise: und darin summe += preis ist die Summe über eine ganze Preisliste. Vor der Schleife anlegen, in der Schleife verändern, nach der Schleife ausgeben. Anders ist nur, woher die Werte kommen. Statt in jeder Runde ein input() zu lesen, holt sich die Schleife den nächsten Eintrag aus der Liste.

Für eine Summe geht es in der nächsten Lektion noch kürzer. Das Muster bleibt trotzdem nützlich, sobald die Frage komplizierter wird als „wie viel zusammen“. Etwa „wie viel zusammen, aber nur für Lebensmittel“.

Mit Nummer

Mit Nummer über die Position
einkauf = ["Brot", "Milch", "Eier"]
for i in range(len(einkauf)):
    print(f"{i + 1}. {einkauf[i]}")

Manchmal brauchst du in der Schleife nicht nur den Eintrag, sondern auch seine Nummer, zum Beispiel für eine nummerierte Liste. Der erste Gedanke ist oft der Weg über die Positionen. range(len(einkauf)) liefert 0, 1 und 2, also genau die Positionen der Liste, und einkauf[i] holt den Eintrag dazu. Das ist der Zusammenhang, den Lektion 5.1 versprochen hat. range(n) und die Positionen einer Liste mit n Einträgen sind dieselben Zahlen.

Es funktioniert. Aber es gibt zwei Stellen, an denen man sich um eins verzählen kann, die Nummer mit i + 1 und den Eintrag mit einkauf[i]. Und es liest sich nicht wie das, was gemeint ist.

Mit Nummer über enumerate
einkauf = ["Brot", "Milch", "Eier"]
for nummer, sache in enumerate(einkauf):
    print(nummer, sache)

enumerate (durchnummerieren) kommt ohne Positionen aus. Es liefert in jeder Runde zwei Werte auf einmal, die Nummer und den Eintrag, und for nummer, sache in verteilt sie auf zwei Namen. Ohne weitere Angabe fängt die Nummer bei 0 an, wie die Positionen. Mit start=1 als zweiter Angabe in den Klammern fängt sie bei 1 an, so wie Menschen zählen.

Dass for zwei Namen auf einmal belegen kann, ist neu. Woher das kommt, erklärt die Lektion über Tupel. Bis dahin reicht es, bei einer Schleife, die Paare liefert, zwei Namen mit einem Komma dazwischen zu schreiben.

Zwei Listen im Gleichschritt

Zwei Listen im Gleichschritt
artikel = ["Brot", "Milch", "Eier"]
preise = [2.49, 1.19, 3.29]
for name, preis in zip(artikel, preise):
    print(f"{name:<10}{preis:>8.2f}")

Manchmal stehen zwei Dinge, die zusammengehören, in zwei Listen, etwa Artikel und Preise. Dann nimmt zip beide im Gleichschritt (zip wie Reißverschluss). In jeder Runde kommt aus jeder Liste der nächste Eintrag, der erste Artikel mit dem ersten Preis, der zweite mit dem zweiten. Wieder verteilt for die beiden auf zwei Namen. Mit festen Spaltenbreiten wird daraus schon fast ein Kassenbon.

Eine Liste ist kürzer
artikel = ["Brot", "Milch", "Eier", "Kaffee"]
preise = [2.49, 1.19, 3.29]
for name, preis in zip(artikel, preise):
    print(f"{name:<10}{preis:>8.2f}")
print(len(artikel), "Artikel,", len(preise), "Preise")

Einen Haken hat zip, und der ist leise. Sind die Listen verschieden lang, hört es auf, sobald die kürzere zu Ende ist. Im Beispiel hat der Kaffee keinen Preis bekommen, und er taucht in der Ausgabe einfach nicht auf. Keine Meldung, kein Fehler, nur eine Zeile weniger. Erst die letzte Zeile verrät es: vier Artikel, drei Preise.

Besser ist es deshalb, Dinge, die zusammengehören, gar nicht erst auf zwei Listen zu verteilen. Wie das geht, zeigt Lektion 5.7.

Was die Aufgabe will

Gefragt ist eine nummerierte Liste mit dem, was heute ansteht. Die Einträge kommen ab hier aus einer Datei, so wie Daten im Alltag meistens ankommen. Zwei Zeilen im Startcode lesen sie als Liste ein, und wie das im Einzelnen geht, zeigt Abschnitt 11. Was fehlt, ist die Ausgabe mit Nummern ab 1. Und ein Satz für den Tag, an dem gar nichts ansteht.

Zum Mitnehmen

for geht eine Liste Eintrag für Eintrag durch, so wie vorher einen Text. enumerate zählt dabei mit, zip nimmt zwei Listen im Gleichschritt. Eine Position braucht man dafür fast nie.

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 5 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.