Abschnitt 5 · Lektion 2
Listen verändern
Ein Einkaufszettel bleibt selten, wie er ist. Aus dem Bad ruft jemand, dass das Shampoo alle ist. Die Milch soll doch Hafermilch sein. Und das Brot hat schon jemand auf dem Heimweg mitgebracht.
Bisher stand eine Liste fest, so wie sie im Code geschrieben war. Du kannst sie aber auch nachträglich ändern, Eintrag für Eintrag, ohne sie jedes Mal neu hinzuschreiben.
Einen Eintrag ersetzen
einkauf = ["Brot", "Milch", "Eier"]
einkauf[1] = "Hafermilch"
print(einkauf) Die eckigen Klammern zum Lesen gehen auch links vom Gleichheitszeichen. einkauf[1] = "Hafermilch"
liest man wie jede Zuweisung. Position 1 bekommt einen neuen Wert, und was vorher dort stand, ist
weg. Alles andere bleibt, wie es war, auch die Länge.
Das klappt nur mit Positionen, die es schon gibt. Bei drei Einträgen hängt einkauf[3] = "Butter"
nichts an. Python bricht mit einem IndexError ab, genau wie beim Lesen. Zum Anhängen gibt es etwas
Eigenes.
Anhängen und einfügen
einkauf = ["Brot", "Milch"]
einkauf.append("Kaffee")
print(einkauf)
einkauf.insert(0, "Äpfel")
print(einkauf) einkauf.append("Kaffee") hängt einen Eintrag hinten an (append heißt anhängen). Die Liste wird
dabei um eins länger. Mit einkauf.insert(0, "Äpfel") fügst du einen Eintrag an einer bestimmten
Position ein (insert, einfügen). Erst kommt die Position, dann der Wert. Alles, was ab dieser
Position stand, rutscht eine Stelle nach hinten.
Neu ist die Schreibweise mit dem Punkt. append ist eine Methode (method), also eine Funktion,
die zu einem bestimmten Wert gehört und an ihm aufgerufen wird. Vor dem Punkt steht, was bearbeitet
wird. Dahinter steht, was passieren soll, und in den Klammern, womit. Listen haben rund ein Dutzend
solcher Methoden und Text noch viel mehr. Ab Abschnitt 6 begegnen sie dir ständig.
Die wichtigste davon ist append, denn so entstehen Listen meistens. Man fängt mit einer leeren an
und hängt in einer Schleife an, was dazukommt. Im Reiter Debug kannst du zusehen, wie die Liste
dabei Zeile für Zeile wächst.
Streichen und herausnehmen
einkauf = ["Äpfel", "Brot", "Milch", "Kaffee"]
einkauf.remove("Brot")
print(einkauf)
zuletzt = einkauf.pop()
print(zuletzt, einkauf)
zuerst = einkauf.pop(0)
print(zuerst, einkauf) remove streicht einen Eintrag über seinen Wert und nicht über seine Position.
einkauf.remove("Brot") sucht das Brot und nimmt es heraus. Steht derselbe Wert mehrmals in der
Liste, verschwindet nur der erste.
pop (etwa herausnehmen) geht über die Position. Ohne Angabe ist der letzte Eintrag dran, mit
pop(0) der erste. Anders als die übrigen Methoden in dieser Lektion gibt pop dabei etwas zurück,
nämlich den herausgenommenen Eintrag. Im Beispiel landet er in zuletzt und zuerst. Die Liste ist
danach um ihn kürzer.
So funktioniert eine Warteschlange. Wer vorn steht, wird mit pop(0) aufgerufen. Wer neu kommt,
stellt sich mit append hinten an.
Nachsehen, ob etwas drin ist
einkauf = ["Brot", "Milch"]
print("Milch" in einkauf)
print("Butter" in einkauf)
print("Butter" not in einkauf)
einkauf.remove("Butter") Bevor du etwas streichst, willst du oft wissen, ob es überhaupt da ist. Dafür gibt es in. Das ist
dasselbe Wort wie im for, hier aber als Frage. "Milch" in einkauf ist True, wenn die Milch auf
dem Zettel steht, sonst False. not in fragt andersherum.
Wenn du streichst, was nicht da ist, gibt es einen Fehler.
ValueError: list.remove(x): x not in list heißt „x steht nicht in der Liste“. Das x steht dabei
für irgendeinen Wert, den gesuchten nennt die Meldung nicht. Um welchen es ging, siehst du in der
Zeile darüber im Traceback.
einkauf = ["Brot", "Milch"]
gekauft = "Butter"
if gekauft in einkauf:
einkauf.remove(gekauft)
else:
print(gekauft, "stand gar nicht drauf.")
print(einkauf) Zusammen mit einem if aus Abschnitt 3 wird aus in ein Ablauf, der nicht abbricht. Steht die
Butter auf dem Zettel, wird sie gestrichen. Sonst sagt das Programm Bescheid und macht weiter.
Die Liste ist weg
einkauf = ["Brot", "Milch"]
einkauf = einkauf.append("Kaffee")
print(einkauf)
einkauf.append("Eier") Diesen Fehler macht fast jeder einmal. append, insert und remove ändern die Liste selbst und
geben nichts zurück. Genauer gesagt geben sie None zurück, das „noch kein Wert“ aus Lektion 3.5.
Wer gewohnt ist, ein Ergebnis wieder unter seinem Namen abzulegen, so wie bei
zaehler = zaehler + 1, schreibt schnell mal einkauf = einkauf.append("Kaffee"). Der Kaffee wird
dabei sogar angehängt. Danach bekommt einkauf aber das, was append zurückgibt, also None, und
die Liste ist weg.
In dieser Zeile meldet Python nichts. Ein print zeigt danach still None an. Der Fehler kommt
erst, wenn du wieder eine Methode der Liste aufrufst:
AttributeError: 'NoneType' object has no attribute 'append'. Übersetzt heißt das, ein Wert vom Typ
NoneType, also None, hat keine Methode namens append.
Wenn in einer Fehlermeldung NoneType steht, wo eigentlich eine Liste sein sollte, lohnt sich
deshalb ein Blick weiter nach oben, auf die letzte Zeile, in der dieser Name ein Gleichheitszeichen
hinter sich hatte. Im Reiter Debug sieht man es auch, denn ab der dritten Zeile steht neben
einkauf nur noch None.
Vor einer Methode, die eine Liste ändert, steht also kein Gleichheitszeichen. Die Ausnahme ist
pop. Dort willst du den herausgenommenen Eintrag ja haben.
Was die Aufgabe will
Diesmal geht es in den Laden. Der Einkaufszettel steht im Code, und in eingabe.txt steht, was
nacheinander in den Korb wandert. Was auf dem Zettel steht, wird dort gestrichen. Was nicht
draufsteht, kommt in eine zweite Liste für die Spontankäufe. Am Ende stehen beide Listen da, also
was noch fehlt und was dazugekommen ist.
Zum Mitnehmen
Eine Liste kannst du ändern, ohne sie neu hinzuschreiben. append hängt hinten an, insert fügt an einer Stelle ein, remove streicht einen Wert und pop nimmt einen Eintrag heraus und gibt ihn zurück. Ob etwas drin ist, fragst du mit in. Weil die Methoden die Liste selbst ändern, kommt vor sie kein Gleichheitszeichen.
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.