Abschnitt 6 · Lektion 2
Zerlegen und zusammensetzen
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
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
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
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
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.
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
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, 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.