mitmario.dev

Listen anlegen und lesen

Python Sandbox 5 Min Lesezeit 5 BeispieleLektion 1 von 8

Du willst eine Woche Temperaturen speichern. Bisher hat jeder Wert seinen eigenen Namen, also brauchst du sieben Variablen, montag, dienstag und so weiter bis sonntag. Für einen Monat wären es einunddreißig.

Eine Schleife hilft da auch nicht weiter. Sie kann zwar einen Namen in jeder Runde neu belegen, aber von montag zu dienstag weiterspringen kann sie nicht. Wenn du wissen willst, welcher Tag der wärmste war, stehen am Ende sieben if untereinander, und spätestens beim Monat lässt man es bleiben.

Für solche Daten gibt es Listen (list). Ab hier sehen die Werte in diesem Kurs aus wie im echten Leben. Eine Spalte aus einer Tabelle, eine Woche Messwerte, ein Einkaufszettel.

Viele Werte unter einem Namen

Eine Woche in einer Liste
temperaturen = [12, 15, 9, 11, 14, 16, 13]
print(temperaturen)
print(len(temperaturen), "Werte")

Eine Liste steht in eckigen Klammern. Die Werte darin sind mit Kommas getrennt, und jeder davon ist ein Eintrag (auf Englisch item oder element). temperaturen ist also ein einziger Name für sieben Zahlen. Die Reihenfolge bleibt so, wie sie dasteht. Montag zuerst, Sonntag zuletzt.

Mit print siehst du die ganze Liste so, wie sie im Code steht, samt Klammern und Kommas. Und len() kennst du schon von Text. Dort zählt es die Zeichen, bei einer Liste zählt es die Einträge. Hier sind es 7.

Zählen ab null

Ein Eintrag über seine Position
temperaturen = [12, 15, 9, 11, 14, 16, 13]
print("Montag:", temperaturen[0])
print("Dienstag:", temperaturen[1])
print("Sonntag:", temperaturen[6])

Einen einzelnen Eintrag holst du über seine Position (index). Erst kommt der Name der Liste, dahinter in eckigen Klammern die Nummer. temperaturen[0] ist der Montag und temperaturen[1] der Dienstag. Der erste Eintrag hat also die Position 0 und nicht 1. Der Sonntag ist der siebte Eintrag und steht auf 6.

Das wirkt beim ersten Mal verdreht. Es hat aber einen Grund, und Lektion 4.2 hat ihn schon angekündigt. Die Position sagt nicht „der wievielte“, sondern „wie weit vom Anfang entfernt“. Der erste Eintrag ist null Schritte vom Anfang weg und hat deshalb die 0, der zweite die 1. Bei Stockwerken ist es genauso. Das Erdgeschoss hat die Nummer 0, und im ersten Stock bist du eine Treppe weit gekommen.

Daraus folgt der Rest. In einer Liste mit sieben Einträgen gehen die Positionen von 0 bis 6. Die höchste ist also immer um eins kleiner als die Länge. range(7) liefert genau diese Zahlen, 0 bis 6, und Lektion 5.3 macht etwas daraus.

Von hinten gezählt

Von hinten gezählt
temperaturen = [12, 15, 9, 11, 14, 16, 13]
print("Sonntag:", temperaturen[-1])
print("Samstag:", temperaturen[-2])
print("Auch Sonntag:", temperaturen[len(temperaturen) - 1])

Oft willst du gar nicht den dritten Eintrag, sondern den letzten. Die Temperatur von heute, den neuesten Kontostand, wer zuletzt ins Ziel kam. Dafür gibt es negative Positionen. temperaturen[-1] ist der letzte Eintrag, temperaturen[-2] der vorletzte und so weiter nach vorn.

Wozu das gut ist, merkst du, sobald die Liste länger wird. temperaturen[6] ist der Sonntag nur, solange die Liste genau sieben Einträge hat. Kommt eine zweite Woche dazu, zeigt die 6 auf irgendeinen Tag mitten in der Liste. Und niemand merkt es. [-1] ist dagegen immer der letzte, egal wie lang die Liste ist.

Mit len() geht es auch. temperaturen[len(temperaturen) - 1] rechnet die letzte Position aus, Länge minus eins. Das stimmt, liest sich aber wie eine Rechenaufgabe. In Python schreibt man [-1].

Eine Position zu weit

Eine Position zu weit
temperaturen = [12, 15, 9, 11, 14, 16, 13]
print(len(temperaturen), "Werte")
print("Sonntag:", temperaturen[7])

Wenn du nach einer Position fragst, die es nicht gibt, bricht Python ab. Die Meldung lautet IndexError: list index out of range, auf Deutsch etwa „die Position liegt außerhalb der Liste“. Im Beispiel wird vorher noch die Länge ausgegeben, 7. Danach geht die Frage nach Position 7. Wer die Länge für die letzte Position hält, landet hier, denn die letzte Position ist 6.

Das ist der häufigste Fehler mit Listen überhaupt. Er hat dieselbe Wurzel wie der Fehler um eins bei range. Immerhin wird er laut. Eine Woche mit sechs Tagen fällt keinem auf, dieser Fehler sofort.

Einen zweiten Fehler gibt es an derselben Stelle, und der kommt fast immer zusammen mit input(). Steht in den eckigen Klammern ein Text, auch einer, der wie eine Zahl aussieht, meldet Python TypeError: list indices must be integers or slices, not str. Eine Position ist eine ganze Zahl. Was input() liefert, ist Text, bis du es mit int() umwandelst.

Listen mit Text

Eine Liste mit Text
einkauf = ["Brot", "Milch", "Eier",
           "Kaffee", "Butter"]
print(einkauf)
print(einkauf[0])
print(len(einkauf), "Sachen")
nichts = []
print(nichts, len(nichts))

In eine Liste passt alles, was Python als Wert kennt, also auch Text. Ein Einkaufszettel ist eine Liste von Texten, und einkauf[0] ist das Brot.

Die Liste im Beispiel steht über zwei Zeilen. Das geht immer, denn solange die eckige Klammer noch offen ist, liest Python in der nächsten Zeile weiter. Wie weit die zweite Zeile eingerückt ist, spielt keine Rolle. Üblich ist, sie unter den ersten Eintrag zu schieben.

Beim Ausgeben fällt dir vielleicht eine Kleinigkeit auf. print(einkauf) zeigt ['Brot', 'Milch', 'Eier', 'Kaffee', 'Butter'] mit einfachen Anführungszeichen um jeden Eintrag. Im Code stehen aber doppelte. So schreibt Python Text, wenn es eine ganze Liste zeigt, und im Reiter Debug sieht es genauso aus. Ohne die Zeichen könntest du [1, 2] nicht von ['1', '2'] unterscheiden. Das eine sind Zahlen, das andere ist Text. Ein einzelner Eintrag kommt dagegen ohne Anführungszeichen, wie jeder andere Text in print.

Eine Liste darf auch leer sein. [] hat die Länge 0, und in einem if gilt eine leere Liste als falsch, wie schon bei den Entscheidungen. Sie darf außerdem verschiedene Sorten mischen, etwa ["Brot", 2, 2.49]. Das geht. Eine gute Idee ist es selten, denn eine Liste ist für viele Dinge derselben Sorte gedacht. Für Werte, die zusammen ein einziges Ding beschreiben, gibt es etwas Besseres, und das kommt am Ende dieses Abschnitts.

Übrigens hat auch Text Positionen. "Python"[0] ist das P, "Python"[-1] das n, und len("Python") ist 6. Fast alles aus dieser Lektion gilt für Text genauso.

Was die Aufgabe will

Nach einem kleinen Volkslauf steht die Ergebnisliste in der Reihenfolge, in der alle ins Ziel kamen. Gefragt sind der erste und der letzte Platz und wie viele es waren. Danach geht es um einen bestimmten Platz. Wer ist dort gelandet? Platz 1 ist bei Python die Position 0, und da liegt der Haken.

Zum Mitnehmen

Eine Liste hält viele Werte in fester Reihenfolge unter einem Namen. Jeder Eintrag hat eine Position, und gezählt wird ab null. Mit -1 kommst du an den letzten Eintrag, ganz gleich, wie lang die Liste ist.

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.