6. Unterrichtsblock

Listen anlegen

Bisher hat jede Variable genau einen Wert gespeichert. Für einen Einkaufszettel, eine Klassenliste oder eine Bestenliste bräuchtest du dann Dutzende Variablen. Eine Liste speichert beliebig viele Werte unter einem Namen. Du schreibst sie in eckige Klammern, die Elemente trennst du mit Kommas:

fruechte = ["Apfel", "Banane", "Kirsche"]
print(fruechte)
print(len(fruechte))
print(type(fruechte))

leer = []
print(len(leer))
Ausgabe im Terminal
['Apfel', 'Banane', 'Kirsche']
3
<class 'list'>
0
Eigenschaftbedeutet
geordnetDie Elemente behalten ihre Reihenfolge, neue kommen ans Ende.
indiziertJedes Element hat eine Nummer (Index), beginnend bei 0.
veränderbarElemente können nachträglich geändert, eingefügt und entfernt werden.
Duplikate erlaubtDerselbe Wert darf mehrmals vorkommen.

Gemischte Werte und doppelte Einträge

Eine Liste darf Werte verschiedener Datentypen enthalten, und derselbe Wert darf mehrmals vorkommen:

person = ["Lina", 16, True, 1.68]
noten = [2, 1, 2, 3, 2]
print(person)
print(noten)
print(len(noten))
Ausgabe im Terminal
['Lina', 16, True, 1.68]
[2, 1, 2, 3, 2]
5

Listen aus anderen Werten bauen: list()

list() macht aus anderen Sammlungen eine Liste, zum Beispiel aus einem range() (Block 3) oder aus einem String (Block 5):

zahlen = list(range(1, 6))
buchstaben = list("Python")
print(zahlen)
print(buchstaben)
Ausgabe im Terminal
[1, 2, 3, 4, 5]
['P', 'y', 't', 'h', 'o', 'n']

Neben Listen kennt Python weitere Sammlungen: Tupel (wie Listen, aber unveränderlich, in runden Klammern), Sets und Dictionaries. Die lernst du später kennen.

Zugriff auf Elemente

Auf ein Element greifst du über seinen Index zu, genau wie bei den Zeichen eines Strings in Block 5. Gezählt wird ab 0, von hinten mit negativen Zahlen:

Element„Apfel“„Banane“„Kirsche“„Kiwi“
Index0123
von hinten-4-3-2-1
obst = ["Apfel", "Banane", "Kirsche", "Kiwi"]
print(obst[0])
print(obst[2])
print(obst[-1])
print(obst[4])
Ausgabe im Terminal
Apfel
Kirsche
Kiwi
Traceback (most recent call last):
  ...
IndexError: list index out of range

Die letzte Zeile bricht das Programm ab: Die Liste hat vier Elemente mit den Indizes 0 bis 3, einen Index 4 gibt es nicht.

Bereiche mit Slicing

Mit [start:ende] bekommst du eine neue Liste mit einem Ausschnitt. Wie bei Strings ist das Ende nicht enthalten, und eine dritte Zahl gibt die Schrittweite an:

obst = ["Apfel", "Banane", "Kirsche", "Orange", "Kiwi", "Melone", "Mango"]
print(obst[1:4])
print(obst[:3])
print(obst[4:])
print(obst[-3:])
print(obst[::2])
Ausgabe im Terminal
['Banane', 'Kirsche', 'Orange']
['Apfel', 'Banane', 'Kirsche']
['Kiwi', 'Melone', 'Mango']
['Kiwi', 'Melone', 'Mango']
['Apfel', 'Kirsche', 'Kiwi', 'Mango']

Ist ein Element in der Liste?

in und not in aus Block 4 funktionieren auch mit Listen. Verglichen wird das ganze Element, nicht ein Teil davon:

obst = ["Apfel", "Banane", "Kirsche"]
print("Banane" in obst)
print("Ban" in obst)
print("Mango" not in obst)

if "Kirsche" in obst:
    print("Kirschen sind da.")
Ausgabe im Terminal
True
False
True
Kirschen sind da.
Merke: Der erste Index ist 0, der letzte ist len(liste) - 1 oder einfach -1. Beim Slicing ist das Ende nie enthalten: liste[1:4] liefert die Elemente mit Index 1, 2 und 3.

Aufgabe 1 – Die Siegerehrung

Zeit: ca. 8 Minuten

Erst denken, dann tippen: Das ist die Zieleinlaufliste beim Schulsportfest. Sage für jede print-Zeile die Ausgabe voraus, schreibe sie als Kommentar dazu und prüfe sie dann.

platzierung = ["Lina", "Tom", "Ayşe", "Ben", "Mia", "Noah", "Ella"]
print(platzierung[0])
print(platzierung[-1])
print(platzierung[2:5])
print(platzierung[:3])
print(len(platzierung))
print("tom" in platzierung)
  1. Sage jede Ausgabe voraus und prüfe sie. Notiere bei jedem Irrtum kurz, woran es lag.
  2. Für das Siegertreppchen brauchst du die ersten drei, für die Urkunde „Teilgenommen“ alle ab Platz 4. Gib beide Gruppen mit Slicing aus. Kontrolle: ['Lina', 'Tom', 'Ayşe'] und ['Ben', 'Mia', 'Noah', 'Ella'].
  3. Was passiert bei platzierung[7]? Und warum gibt platzierung[5:20] keinen Fehler? Antworte als Kommentar.

Elemente ändern

Listen sind veränderbar: Du kannst einem Element über seinen Index einen neuen Wert zuweisen. Bei Strings geht das nicht, die sind unveränderlich:

obst = ["Apfel", "Banane", "Kirsche"]
obst[1] = "Mango"
print(obst)

wort = "Hund"
wort[0] = "M"
Ausgabe im Terminal
['Apfel', 'Mango', 'Kirsche']
Traceback (most recent call last):
  ...
TypeError: 'str' object does not support item assignment

Einen ganzen Bereich ersetzen

Weist du einem Bereich eine neue Liste zu, wird der Bereich ersetzt. Die neue Liste darf auch kürzer oder länger sein, dann rücken die übrigen Elemente entsprechend nach:

obst = ["Apfel", "Banane", "Kirsche", "Orange"]
obst[1:3] = ["Himbeere", "Melone"]
print(obst)

obst[1:2] = ["Erdbeere", "Zitrone", "Feige"]
print(obst, len(obst))

obst[0:3] = ["Ananas"]
print(obst, len(obst))
Ausgabe im Terminal
['Apfel', 'Himbeere', 'Melone', 'Orange']
['Apfel', 'Erdbeere', 'Zitrone', 'Feige', 'Melone', 'Orange'] 6
['Ananas', 'Feige', 'Melone', 'Orange'] 4
Merke: Eine Zuweisung an einen Index ersetzt genau ein Element, die Länge bleibt gleich. Eine Zuweisung an einen Bereich kann die Liste länger oder kürzer machen.

Elemente hinzufügen

Zum Hinzufügen gibt es drei Methoden. Wie bei Strings hängst du sie mit einem Punkt an. Anders als String-Methoden verändern sie die Liste selbst und liefern kein neues Ergebnis:

BefehlWirkungListe vorher → nachher
liste.append(3)hängt genau ein Element ans Ende[1, 2] → [1, 2, 3]
liste.insert(1, 2)fügt ein Element an Index 1 ein, der Rest rückt nach hinten[1, 3] → [1, 2, 3]
liste.extend([2, 3])hängt jedes Element einer anderen Sammlung einzeln an[1] → [1, 2, 3]
zettel = ["Brot"]
zettel.append("Milch")
zettel.insert(0, "Eier")
zettel.extend(["Käse", "Butter"])
print(zettel)
print(len(zettel))
Ausgabe im Terminal
['Eier', 'Brot', 'Milch', 'Käse', 'Butter']
5

extend() nimmt jede Sammlung, zum Beispiel auch ein Tupel ("Kiwi", "Orange"). Eine ganze Liste mit append() anzuhängen, ist meist ein Versehen: Dann steckt die ganze Liste als ein einziges Element in der anderen.

Merke: liste.append(x) verändert die Liste und gibt nichts zurück. Schreibe deshalb nie liste = liste.append(x), sonst steht in liste danach None.

Aufgabe 2 – append oder extend?

Zeit: ca. 8 Minuten

Jemand füllt einen Warenkorb. Nicht jede Zeile macht, was gemeint war.

korb = ["Apfel", "Brot"]
korb.append("Milch")
korb.extend(["Käse", "Eier"])
korb.append(["Saft", "Wasser"])
korb.extend("Tee")
korb.insert(1, "Butter")
  1. Sage für jede Zeile voraus, wie die Liste danach aussieht. Prüfe es, indem du nach jeder Zeile print(korb) einfügst.
  2. Wie viele Elemente hat korb am Ende? Kontrolle: 10.
  3. Zwei Zeilen waren sicher anders gemeint. Repariere sie so, dass jede Ware ein eigenes Element ist. Kontrolle: 9 Elemente.

Übungsaufgaben

Jetzt kombinierst du Listen mit if, while und input() aus den Blöcken 3 bis 5. Die Aufgaben 3 bis 7 sind die Kernaufgaben. Wer schneller fertig ist, macht mit den Bonusaufgaben weiter. Elemente entfernen, Listen sortieren und Listen mit for durchlaufen kommt in Block 7.

Aufgabe 3 – Der Einkaufszettel

Zeit: ca. 10 Minuten

Ein kleines Programm soll einen Einkaufszettel aufnehmen.

  1. Beginne mit einer leeren Liste zettel = [].
  2. Frage in einer while-Schleife so lange nach Waren, bis nur Enter gedrückt wird. Jede Ware wird mit append() angehängt.
  3. Steht eine Ware schon auf dem Zettel, wird sie nicht noch einmal angehängt, sondern es erscheint „… steht schon drauf.“
  4. Gib am Ende die Anzahl, den ganzen Zettel sowie die erste und die letzte Ware aus. Ist der Zettel leer, erscheint „Nichts zu kaufen.“

Zusatz: Beginnt eine Eingabe mit „!“ (z. B. !Milch), ist sie dringend: Sie kommt ohne das Ausrufezeichen an die erste Stelle (insert() und Slicing aus Block 5).

Aufgabe 4 – Die Sitzordnung

Zeit: ca. 8 Minuten

Im Computerraum sitzen alle in einer Reihe, Platz 1 ist ganz links. Die Lehrkraft stellt die Sitzordnung um. Gib die Liste nach jedem Schritt aus.

sitzplan = ["Lina", "Tom", "Ayşe", "Ben", "Mia", "Noah"]
  1. Ben und Mia tauschen die Plätze. Tipp: Merke dir einen Namen kurz in einer eigenen Variablen.
  2. Die neue Schülerin Ella setzt sich auf Platz 3, alle ab dort rücken einen Platz weiter.
  3. Die ersten beiden Plätze werden durch die drei Austauschschüler „Luca“, „Sofia“ und „Jan“ ersetzt (ein einziger Befehl mit Slicing).
  4. Gib aus, wer jetzt auf Platz 1 und wer auf dem letzten Platz sitzt, und wie viele Plätze besetzt sind.

Kontrolle: ['Luca', 'Sofia', 'Jan', 'Ella', 'Ayşe', 'Mia', 'Ben', 'Noah'], 8 Plätze.

Aufgabe 5 – Die Wochenplanung

Zeit: ca. 8 Minuten

Zwei Listen gehören zusammen: An derselben Stelle stehen ein Wochentag und sein Termin.

wochentage = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
termine = ["frei", "frei", "frei", "frei", "frei", "frei", "frei"]
  1. Frage nach der Nummer eines Tages (1 = Montag bis 7 = Sonntag) und nach einem Termin.
  2. Ist die Nummer nicht zwischen 1 und 7, erscheint „Diesen Tag gibt es nicht.“ Sonst trägst du den Termin an der richtigen Stelle in termine ein. Achtung: Die Liste beginnt bei Index 0.
  3. Gib zur Kontrolle den Tag und seinen neuen Termin aus, z. B. Donnerstag: Python-Unterricht.

Zusatz: Gib das Wochenende (die letzten zwei Tage) samt Terminen mit Slicing aus.

Aufgabe 6 – Datum zerlegen

Zeit: ca. 10 Minuten

Ein Datum wie 07.10.2026 soll schöner ausgegeben werden: 7. Oktober 2026.

monate = ["Januar", "Februar", "März", "April", "Mai", "Juni",
          "Juli", "August", "September", "Oktober", "November", "Dezember"]
  1. Frage nach einem Datum im Format TT.MM.JJJJ. Zerlege es mit split("."). Das Ergebnis ist eine Liste mit drei Texten.
  2. Wandle Tag und Monat mit int() in Zahlen um. Ist der Monat nicht zwischen 1 und 12, erscheint eine Fehlermeldung.
  3. Hole den Monatsnamen aus monate und gib das Datum aus. Kontrolle: 07.10.2026 ergibt 7. Oktober 2026.

Zusatz: Gib das Quartal aus (Januar bis März = 1. Quartal usw.) und die drei Monate dieses Quartals mit Slicing. Tipp: (monat - 1) // 3 + 1.

Aufgabe 7 – Die Mannschaftswahl

Zeit: ca. 10 Minuten

Für ein Spiel in der Sportstunde wird die Klasse abwechselnd auf zwei Mannschaften verteilt: der Erste in Team A, der Zweite in Team B, der Dritte wieder in Team A und so weiter.

klasse = ["Lina", "Tom", "Ayşe", "Ben", "Mia", "Noah", "Ella", "Jan", "Sofia", "Luca"]
  1. Bilde team_a und team_b mit Slicing und Schrittweite (Block 5), ohne Schleife. Kontrolle Team A: ['Lina', 'Ayşe', 'Mia', 'Ella', 'Sofia'].
  2. Gib beide Teams mit ihrer Größe aus. Der Kapitän ist jeweils der Erste im Team.
  3. Zwei Nachzügler kommen dazu („Emil“ und „Lea“). Jeder wird an das Team angehängt, das gerade kleiner ist (bei Gleichstand Team A).
  4. Frage nach einem Namen und gib aus, in welchem Team die Person spielt, oder „spielt nicht mit“.

Bonusaufgabe 1 – Der Kinosaal

Eine Liste kann wieder Listen enthalten. So lässt sich ein kleiner Kinosaal mit 3 Reihen zu je 4 Plätzen speichern. saal[1][2] ist Reihe 2, Platz 3.

saal = [
    ["frei", "frei", "frei", "frei"],
    ["frei", "besetzt", "besetzt", "frei"],
    ["frei", "frei", "frei", "frei"],
]
  1. Gib die drei Reihen untereinander aus (saal[0], saal[1], saal[2]).
  2. Frage nach Reihe und Platz (jeweils ab 1 gezählt). Ist der Platz frei, wird er auf „besetzt“ gesetzt, sonst erscheint „Leider schon besetzt.“
  3. Prüfe vorher, ob Reihe und Platz überhaupt existieren (len(saal) und len(saal[0])).

Zusatz: Baue eine vierte Reihe mit append() an, in der alle 4 Plätze frei sind.

Bonusaufgabe 2 – Die Würfelstatistik

Ist ein Würfel fair? Lass den Computer 600-mal würfeln und zähle mit, wie oft jede Augenzahl fällt. Eine Liste mit sechs Zählern ist dafür ideal.

import random

anzahl = [0, 0, 0, 0, 0, 0]          # anzahl[0] zählt die Einsen, anzahl[5] die Sechsen
  1. Würfle mit for wurf in range(600): und random.randint(1, 6). Erhöhe nach jedem Wurf den passenden Zähler um 1.
  2. Gib die Zählerliste aus und dazu jede Augenzahl einzeln, z. B. Sechsen: 103.
  3. Prüfe, ob alle Zähler zusammen 600 ergeben.

Zusatz: Welche Anzahl würdest du bei einem fairen Würfel für jede Augenzahl erwarten? Wie weit liegen deine Werte davon weg? Antworte als Kommentar.

Kurz zusammengefasst:
  • Eine Liste speichert viele Werte unter einem Namen: fruechte = ["Apfel", "Banane"]. len() liefert die Anzahl.
  • Zugriff über den Index ab 0, -1 ist das letzte Element. Bereiche mit [start:ende], das Ende ist nicht enthalten.
  • in und not in prüfen, ob ein Element in der Liste steht.
  • Ändern: liste[1] = "neu" oder ganze Bereiche liste[1:3] = [...].
  • Hinzufügen: append() ein Element ans Ende, insert(i, x) an Index i, extend() alle Elemente einer anderen Sammlung.