Abschnitt 6 · Lektion 5
Synthese: Einkaufszettel aufräumen
Drei Leute, eine Notiz-App, ein gemeinsamer Einkaufszettel. Die eine tippt Milch. Der andere tippt
ein paar Stunden später milch, weil er nicht nachgesehen hat, und irgendwer hat zwischendurch
zweimal Enter gedrückt. Lesen kann man so einen Zettel noch. Aber man läuft damit zweimal zum
Kühlregal.
Zum Aufräumen reicht, was du aus diesem Abschnitt und dem über Listen kennst. Zerlegen, putzen und Listen umbauen. Neu ist nur die Frage, in welcher Reihenfolge das alles passiert, und davon hängt ab, ob am Ende ein sauberer Zettel dasteht.
Zerlegen
zettel = """Milch
eier
Brot
brot
Kaffee
milch
Eier
Bananen
"""
zeilen = zettel.splitlines()
print(zeilen)
print(len(zeilen), "Zeilen") So sieht der Zettel aus, wenn man ihn aus der App kopiert. Ein langer Text mit Zeilenumbrüchen.
splitlines() macht daraus eine Liste mit einer Zeile je Eintrag, und mit print siehst du, was da
wirklich steht. Zehn Zeilen, darunter zwei leere, und vor eier und Eier stehen Leerzeichen, weil
jemand mit der Leertaste eingerückt hat.
Zehn Zeilen für fünf verschiedene Sachen. Bis zum sauberen Zettel fehlen noch drei Schritte.
Putzen und leere Zeilen weg
zettel = """Milch
eier
Brot
brot
Kaffee
milch
Eier
Bananen
"""
eintraege = []
for zeile in zettel.splitlines():
eintrag = zeile.strip()
if eintrag:
eintraege.append(eintrag)
print(eintraege)
print(len(eintraege), "Sachen") Jede Zeile bekommt ein strip(), und was danach leer ist, kommt nicht mit. Gefragt wird dafür mit
if eintrag:, denn ein leerer Text gilt als falsch, wie in Lektion 3.5. Das ist das Muster vom
Umbauen einer Liste. Eine leere Liste, eine Schleife, ein if, ein append. Übrig bleiben acht
Einträge, alle ohne Leerzeichen am Rand.
zeilen = ["Milch", " ", "Brot", ""]
eintraege = []
for zeile in zeilen:
if zeile:
eintraege.append(zeile.strip())
print(eintraege) Hier kommt es zum ersten Mal auf die Reihenfolge an. Wenn du erst fragst, ob die Zeile leer ist, und
dann putzt, bleibt ein leerer Eintrag übrig. Die Zeile mit den drei Leerzeichen ist nämlich nicht
leer. Ein Text aus Leerzeichen gilt als wahr, auch das kam schon vor. Also kommt die Zeile durch das
if, erst danach wird sie von strip() zu einem leeren Text, und der landet in der Liste. Auf dem
fertigen Zettel wäre das eine Zeile mit einer Nummer und sonst nichts.
Doppelte weg
eintraege = ["Milch", "eier", "Brot", "brot", "Kaffee",
"milch", "Eier", "Bananen"]
ohne_doppelte = []
for eintrag in eintraege:
if eintrag not in ohne_doppelte:
ohne_doppelte.append(eintrag)
print(ohne_doppelte)
print(len(ohne_doppelte), "Sachen") Ob etwas schon auf der neuen Liste steht, fragt in, und angehängt wird nur, was noch nicht drauf
ist. Das Ergebnis ist ernüchternd. Es sind immer noch acht. Milch und milch sind für Python zwei
verschiedene Texte und damit auch keine Doppelten.
Zum zweiten Mal hängt also alles an der Reihenfolge. Bevor du nach Doppelten suchst, müssen alle
Einträge gleich geschrieben sein. Für einen Einkaufszettel geht das am besten mit großem
Anfangsbuchstaben, so wie title() es macht. Aus milch wird dann Milch, und das steht schon
drauf. Danach bleiben genau fünf Sachen übrig. Ausprobieren kannst du das im Beispiel mit einer
Zeile eintrag = eintrag.title() in der Schleife, vor dem if.
Für Doppelte gibt es in Python übrigens eine eigene Sorte Sammlung, die Menge, und mit ihr wird
dieser Schritt kürzer. Sie kommt in Lektion 7.6. Mit in und einer Liste geht es genauso, und du
siehst dabei, was passiert.
Sortieren und nummerieren
Der letzte Schritt ist der leichteste, denn beides kennst du schon. sorted() bringt die Liste in
die Reihenfolge des Alphabets, und enumerate(..., start=1) gibt jeder Sache ihre Nummer. Sortiert
wird aber erst, wenn alle Einträge gleich geschrieben sind, weil Großbuchstaben beim Sortieren vor
allen Kleinbuchstaben stehen und eine einzige klein geschriebene bananen sonst hinter der Milch
landen würde.
Was die Aufgabe will
Diesmal kommt so ein Zettel aus einer Datei. Der Startcode liest ihn als einen langen Text ein, genau wie den Zettel im ersten Beispiel. Alle vier Schritte sind deine. Am Ende steht ein Zettel mit Nummern da, auf dem jede Sache genau einmal vorkommt.
Zum Mitnehmen
Aufräumen besteht aus vielen kleinen Schritten, und es kommt auf ihre Reihenfolge an. Zuerst zerlegen, dann jede Zeile putzen und die leeren weglassen, dann alles gleich schreiben, und erst danach nach Doppelten suchen. Sortieren und Nummerieren kommen ganz zum Schluss.
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 4 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.