mitmario.dev

Zerlegen und zusammensetzen

Python Sandbox 4 Min Lesezeit 6 BeispieleLektion 2 von 6

Eine Kasse schreibt ihre Verkäufe selten schön auf. Eher so: Brot;2,49;3. Eine Zeile je Verkauf, und in jeder Zeile stehen drei Werte hintereinander, getrennt durch Semikolons. Artikel, Preis, Menge.

Mit Ausschnitten kommst du an die Teile nicht heran, denn Vollkornbrot ist länger als Brot, und in jeder Zeile stünden die Werte an anderen Positionen. Statt Zeichen zu zählen, müsste man das Semikolon suchen. Das macht split.

Zerlegen an Leerraum

Wörter einer Zeile
zeile = "Brot  Milch\tEier "
teile = zeile.split()
print(teile)
print(len(teile), "Sachen")

split() (aufteilen) zerlegt einen Text in eine Liste von Teilen. Ohne Angabe in den Klammern wird an Leerraum getrennt, also an Leerzeichen, Tabulatoren und Zeilenumbrüchen. Dabei ist split() großzügig. Zwei Leerzeichen hintereinander zählen wie eins, und was am Rand steht, fällt weg. Aus der unordentlichen Zeile im Beispiel werden genau drei Wörter.

Heraus kommt eine ganz gewöhnliche Liste mit allem, was dazugehört. len() zählt die Teile, eine Schleife läuft durch sie hindurch, und teile[0] ist das erste Wort.

Zerlegen an einem Zeichen

Felder einer Zeile
zeile = "Brot;2,49;3"
print(zeile.split(";"))
artikel, preis, menge = zeile.split(";")
print(artikel, preis, menge)
print(menge * 2)
print(int(menge) * 2)

Steht in den Klammern ein Zeichen, trennt split genau dort und nirgends sonst. Aus Brot;2,49;3 werden drei Teile. Weil die Zahl der Teile feststeht, kannst du sie gleich auspacken wie ein Tupel, artikel, preis, menge = zeile.split(";"). Mit einem Semikolon mehr oder weniger käme ein ValueError, too many values to unpack oder not enough values to unpack.

Worauf du hier achten musst, zeigen die beiden letzten Zeilen. Jeder Teil ist Text, auch die 3. menge * 2 ergibt deshalb 33, denn ein Text mal zwei ist derselbe Text zweimal, wie in Lektion 2.6. Rechnen kann man erst nach int(menge). Und der Preis 2,49 hat ein deutsches Komma. Wie man daraus eine Zahl macht, ist ein eigenes Thema, zwei Lektionen weiter.

Was das Trennzeichen anders macht

Leere Felder und Leerzeichen
print("Brot;;3".split(";"))
print("Brot; Milch; Eier".split(";"))
print("Brot; Milch; Eier".split("; "))
print([teil.strip() for teil in "Brot; Milch ;Eier".split(";")])

Mit einem Trennzeichen ist split nicht mehr großzügig, sondern genau. Zwei Semikolons hintereinander heißen, dass dazwischen ein Feld leer ist. Dieses leere Feld steht als '' in der Liste. Das ist richtig so, denn in einer Tabelle ist ein leeres Feld etwas anderes als gar keins.

Genauso bleiben Leerzeichen, wo sie stehen. Hat jemand hinter jedes Semikolon ein Leerzeichen getippt, beginnt jeder Teil ab dem zweiten mit einem. split("; ") trennt an Semikolon und Leerzeichen zusammen. Das hilft, solange alle es genau so getippt haben.

Verlässlicher ist die letzte Zeile. Dort wird erst an ; zerlegt und dann jeder Teil mit strip() geputzt, hier in einer List Comprehension. Dann ist es egal, wer wo wie viele Leerzeichen gemacht hat.

Zusammensetzen

Mit Plus bleibt ein Komma übrig
einkauf = ["Brot", "Milch", "Eier"]
satz = ""
for sache in einkauf:
    satz = satz + sache + ", "
print(f"[{satz}]")

Jetzt andersherum. Aus einer Liste soll wieder ein Text werden, etwa Brot, Milch, Eier. Mit + in einer Schleife geht das fast. Hinter jede Sache kommt ein Komma, und am Ende bleibt eins übrig, das niemand haben will. Du könntest es hinterher abschneiden oder in der Schleife fragen, ob gerade die letzte Sache dran ist. Beides ist Bastelei für etwas, das es fertig gibt.

Eine Liste wird ein Satz
einkauf = ["Brot", "Milch", "Eier"]
print(", ".join(einkauf))
print(" und ".join(einkauf))
print(", ".join(["Brot"]))
print("-".join(["2026", "10", "06"]))
print(" ".join("Lena   Schmidt".split()))

join (verbinden) setzt die Teile einer Liste zu einem Text zusammen. Das Trennzeichen kommt dabei zwischen die Teile, nie dahinter, und bei einer einzigen Sache gibt es gar keins.

Die Schreibweise wirkt beim ersten Mal verdreht. In ", ".join(einkauf) steht das Trennzeichen vorn und die Liste in den Klammern. Das liegt daran, dass join eine Methode von Text ist, und der eine Text, der hier sicher dasteht, ist das Trennzeichen. Lesen kannst du es als „verbinde mit Komma und Leerzeichen die Teile von einkauf“.

Die letzte Zeile ist der Kniff, der in Lektion 6.1 versprochen war. split() ohne Angabe wirft jeden Leerraum weg, egal wie viel, und " ".join setzt zwischen die Wörter genau ein Leerzeichen. So wird aus Lena Schmidt wieder Lena Schmidt.

Mehrere Zeilen

Ein Text über mehrere Zeilen
zettel = """Brot
Milch
Eier
"""
print(zettel.split("\n"))
print(zettel.splitlines())
print("Brot\r\nMilch".splitlines())

Ein Text über mehrere Zeilen, mit drei Anführungszeichen geschrieben, lässt sich an "\n" zerlegen, dem Zeilenumbruch. Endet der Text mit einem Umbruch, und das tun fast alle Dateien, dann steht am Ende ein leerer Teil in der Liste. splitlines() (in Zeilen aufteilen) lässt ihn weg.

Außerdem kennt splitlines() die Zeilenenden von Windows, \r\n. Mit split("\n") bliebe dort an jeder Zeile ein unsichtbares \r hängen. Für Text mit Zeilen ist splitlines() deshalb die bessere Wahl.

Eine Zeile wie Brot;2,49;3 ist übrigens schon fast eine Tabelle. Dateien aus lauter solchen Zeilen heißen CSV, und in Abschnitt 12 liest Python sie mit einem eigenen Werkzeug ein. Was dort im Hintergrund passiert, ist im Kern das hier.

Was die Aufgabe will

Ein Einkauf kommt als Zeilen der Form Brot;2, Artikel und Menge. Daraus wird ein Satz wie Einkauf: 2 Brot, 1 Milch, 6 Eier., und dazu kommt die Zahl aller Stücke zusammen. Das Semikolon trennt und join setzt zusammen. Für das Zusammenzählen muss die Menge aber erst eine Zahl werden.

Zum Mitnehmen

split zerlegt einen Text in eine Liste, ohne Angabe an jedem Leerraum, mit Angabe genau an diesem einen Zeichen. join setzt eine Liste wieder zu einem Text zusammen und stellt das Trennzeichen nur zwischen die Teile. Was split liefert, ist immer Text, auch wenn es nach einer Zahl aussieht.

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.