mitmario.dev

Synthese: Einkaufszettel aufräumen

Python Sandbox 3 Min Lesezeit 4 BeispieleLektion 5 von 6

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

Der Zettel aus der Notiz-App
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

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.

Erst prüfen, dann putzen
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

Doppelte, die keine sind
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, 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 4 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.