Abschnitt 5 · Lektion 5
Ausschnitte
Die drei Monate mit dem höchsten Verbrauch, die letzten drei Messwerte, das Jahr aus einem Datum. Oft brauchst du nicht die ganze Liste und auch nicht nur einen Eintrag, sondern ein Stück dazwischen. Mit dem, was du bisher kennst, wäre das eine Schleife, die mitzählt und ab einer bestimmten Position anhängt, was sie findet. Python hat dafür eine eigene Schreibweise. Sie ist kürzer als dieser Satz.
Von, bis
monate = ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun"]
print(monate[1:4])
print(monate[:3])
print(monate[3:]) In die eckigen Klammern einer Liste passen auch zwei Zahlen mit einem Doppelpunkt dazwischen.
monate[1:4] heißt „von Position 1 bis vor Position 4“, und heraus kommen Februar, März und April.
So ein Stück heißt Ausschnitt (slice). Es ist selbst wieder eine Liste.
Die Regel ist dieselbe wie bei range in Lektion 4.2. Der Anfang gehört dazu, das Ende nicht. Das
hat sogar einen Vorteil, weil die Länge eines Ausschnitts dann einfach Ende minus Anfang ist, hier 4
minus 1 gleich 3.
Wenn eine der beiden Zahlen fehlt, geht der Ausschnitt bis zum Rand. monate[:3] fängt am Anfang an
und liefert die ersten drei. monate[3:] fängt bei Position 3 an und nimmt alles bis zum Ende.
Beide zusammen ergeben wieder die ganze Liste, ohne dass ein Monat doppelt dasteht oder fehlt.
Von hinten
monate = ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun"]
print(monate[-3:])
print(monate[:-1])
print(monate[-3:-1]) Negative Positionen gehen auch hier. monate[-3:] heißt „ab dem drittletzten bis zum Ende“, also
die letzten drei, und das stimmt bei jeder Länge der Liste. monate[:-1] ist alles bis auf den
letzten Eintrag.
In der dritten Zeile steckt die Falle. monate[-3:-1] sind nur zwei Monate, April und Mai. Das Ende
gehört nicht dazu, auch von hinten nicht, und -1 ist der Juni. Für die letzten drei lässt du das
Ende einfach weg.
Ausschnitt einer sortierten Liste
runden = [52.4, 49.8, 51.1, 48.9, 50.3, 53.0]
schnellste = sorted(runden)[:3]
print(schnellste)
print(f"Im Schnitt: {sum(schnellste) / len(schnellste):.1f} Sekunden")
print(runden) Einen Ausschnitt kannst du an alles hängen, was eine Liste liefert, auch an sorted(). Bei
sorted(runden)[:3] wird zuerst sortiert, mit der kürzesten Zeit vorn, und erst dann werden die
ersten drei abgeschnitten. Das sind die drei schnellsten Runden. Mit reverse=True stehen die
größten vorn.
Weil der Ausschnitt eine Liste ist, funktionieren sum() und len() darauf wie auf jeder anderen.
Der Schnitt der drei schnellsten Runden passt also in eine Zeile. Die Liste runden selbst bleibt,
wie sie war, denn sorted() und der Ausschnitt machen beide eine neue.
Text schneiden
datum = "2026-10-06"
print(datum[:4], datum[5:7], datum[8:])
deutsch = "06.10.2026"
print(deutsch[-4:])
print("Python"[1:4]) Bei Text geht dieselbe Schreibweise, Zeichen für Zeichen. In einem Datum wie "2026-10-06" steht
das Jahr auf den Positionen 0 bis 3, also datum[:4]. Der Monat steht auf 5 und 6 und der Tag ab
Position 8. Beim deutschen Datum "06.10.2026" ist das Jahr hinten, und deutsch[-4:] holt es von
dort.
Daten in genau dieser Form gibt es in Tabellen ständig. Bessere Mittel als Positionen abzuzählen bringt schon Abschnitt 6, und in Abschnitt 12 wird aus solchen Daten ein echtes Werkzeug.
Zu weit ist kein Fehler
monate = ["Jan", "Feb", "Mär"]
print(monate[:10])
print(monate[-10:])
print(monate[5:]) Anders als eine einzelne Position darf ein Ausschnitt über den Rand hinausgehen. Bei drei Monaten
liefert monate[:10] einfach alle drei. monate[-10:] auch. Und monate[5:] ergibt eine leere
Liste. Einen IndexError gibt es bei Ausschnitten nicht.
Meistens ist das genau richtig. „Die drei größten“ einer Liste mit nur zwei Einträgen sind eben die
zwei, die da sind. Wer stattdessen sortiert[0], sortiert[1] und sortiert[2] einzeln holt,
bekommt bei zwei Einträgen den IndexError.
Ein Ausschnitt ist eine Kopie
zettel = ["Brot", "Milch"]
auch_zettel = zettel
auch_zettel.append("Eier")
print(zettel)
kopie = zettel[:]
kopie.append("Kaffee")
print(zettel)
print(kopie) Zum Schluss noch etwas, das mit Ausschnitten nur am Rand zu tun hat, aber trotzdem hierher gehört.
auch_zettel = zettel macht keine zweite Liste. Es gibt derselben Liste nur einen zweiten Namen.
Wenn du über den einen Namen etwas anhängst, steht es auch unter dem anderen, weil es dieselbe Liste
ist. Im Beispiel sind die Eier deshalb auch auf zettel gelandet, obwohl dort nie jemand etwas
angehängt hat.
Eine echte Kopie ist ein Ausschnitt von Anfang bis Ende, zettel[:]. Das ist eine neue Liste mit
denselben Einträgen, und was du an ihr änderst, bleibt bei ihr. Bei Zahlen und Text gibt es diese
Überraschung nicht, denn die kann man nicht ändern, nur neu zuweisen. Bei Listen schon. Wer einmal
eine halbe Stunde gesucht hat, warum sich eine Liste ändert, die niemand angefasst hat, kennt den
Grund.
Was die Aufgabe will
Der Stromzähler aus der letzten Lektion ist noch einmal dran. Gefragt sind die drei höchsten Monatswerte, die letzten drei Monate und deren Durchschnitt. Und das soll auch dann klappen, wenn der Zähler erst seit zwei Monaten läuft.
Zum Mitnehmen
Ein Ausschnitt [von:bis] fängt bei Position von an und hört vor Position bis auf, genau wie range. Was herauskommt, ist eine neue Liste oder ein neuer Text. Schneidest du über den Rand hinaus, gibt es keinen Fehler, nur weniger Einträge.
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.