mitmario.dev

Listen verändern

Python Sandbox 4 Min Lesezeit 6 BeispieleLektion 2 von 8

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

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

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

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

Steht es drauf
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.

Erst nachsehen, dann streichen
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

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