mitmario.dev

Ausschnitte

Python Sandbox 4 Min Lesezeit 6 BeispieleLektion 5 von 8

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

Ein Stück aus der Mitte
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

Die letzten drei
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

Die drei schnellsten Runden
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

Ausschnitte aus Text
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

Zu weit geschnitten
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

Zwei Namen für eine Liste
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, 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.