Listen
Kurz gesagt: Eine Liste (list) ist eine Reihe von Werten unter einem Namen. Jedes Element hat eine Nummer, seinen Index ab 0, und die Liste wächst mit append.
Problem
Dreißig Noten
Eine Lehrerin schreibt ein Programm für die Punkte aus der Klassenarbeit. Für fünf Schüler legt sie fünf Variablen an:
score1 = 62score2 = 85score3 = 47score4 = 91score5 = 78total = score1 + score2 + score3 + score4 + score5print(total)363In der Klasse sind aber dreißig. Dreißig Variablen, dreißig Summanden. Und für die höchste Punktzahl braucht es noch neunundzwanzig Vergleiche. Die Schleife aus der letzten Lektion hilft nicht: Sie kann nicht durch score1, score2, score3 gehen, denn das sind getrennte Namen. Wir brauchen viele Werte unter einem Namen.
Die Idee
Eine Liste: eine Reihe von Kästchen
Eine Liste (list) ist eine Reihe von Werten unter einem Namen. Jeder Wert, ein Element der Liste, hat eine Nummer: seinen Index. Die Indizes beginnen bei 0. In Java und C# heißt dasselbe Array.
scores = [62, 85, 47, 91, 78]print(scores[0])print(scores[4])print(len(scores))scores[2] = 50print(scores[2])6278550- Die Werte stehen in eckigen Klammern
[ ], getrennt durch Kommas. Einen Typ schreibst du nicht. Du kannst Zahlen und Text in einer Liste mischen, aber meistens sind alle Elemente von einer Art.
scores[0]ist das erste Element,scores[4]das fünfte. Der letzte Index ist immer um 1 kleiner als die Anzahl.len(scores)ist die Anzahl der Elemente. Hier ist sie 5.scores[2] = 50ändert ein Element. Die anderen bleiben gleich.
Wenn du die Werte noch nicht kennst, aber weißt, wie viele es sind, multiplizierst du eine Liste mit einer Null mit der Anzahl:
booked = [0] * 3booked[1] = 2print(booked)[0, 2, 0]Anders als Arrays in Java und C# wächst eine Liste. append fügt ein Element am Ende hinzu:
scores = [62, 85]scores.append(47)print(scores)print(len(scores))[62, 85, 47]3print mit einer ganzen Liste zeigt ihre Elemente in [ ]. Das ist praktisch zum Prüfen. Für die Ausgabe des Programms gibst du die Elemente aber meistens selbst aus.
Genauer, für Neugierige
- Ein negativer Index zählt von hinten:
scores[-1]ist das letzte Element,scores[-2]das vorletzte.
scores = [62, 85, 47, 91, 78]print(scores[-1])print(scores[-2])7891Probier es aus
Welches ist welches?
Was gibt das Programm aus?
prices = [12, 7, 30, 5]print(prices[1] + prices[3])Wir zählen ab 0: prices[1] ist 7 (das zweite), prices[3] ist 5 (das vierte). 7 + 5 = 12. Wenn du ab 1 zählst, nimmst du 12 und 30.
Die Idee
Eine Schleife durch die Liste
Jetzt hilft die Schleife. Der Zähler i wird zum Index: Er geht von 0 bis zum letzten und nimmt in jeder Runde scores[i].
scores = [62, 85, 47, 91, 78]total = 0for i in range(len(scores)): total += scores[i]print(f"Summe: {total}")print(f"Durchschnitt: {total / len(scores)}")Summe: 363Durchschnitt: 72.6Der Zähler geht durch range(len(scores)): von 0 bis len(scores) - 1, also genau die Indizes. Wenn du alle dreißig Noten in [ ] einträgst, ändert sich die Schleife nicht. Das nennt man die Liste durchlaufen.
/ liefert in Python immer eine Kommazahl, deshalb kommt der Durchschnitt ohne Zusatz als 72,6 heraus. Die Ganzzahldivision ist //.
Genauer, für Neugierige
Python hat dafür auch fertige Funktionen: sum(scores) ist die Summe, max(scores) und min(scores) sind der größte und der kleinste Wert. Hier schreiben wir sie selbst, damit du siehst, wie sie funktionieren. Deshalb heißt die Variable auch total und nicht sum: So bleibt der Name sum für die Funktion frei.
scores = [62, 85, 47, 91, 78]print(sum(scores), max(scores), min(scores))363 91 47Sieh es dir an
Die höchste Punktzahl
Wie findest du die größte Zahl? Du merkst dir die bisher größte und ersetzt sie, sobald du eine größere siehst.
scores = [62, 85, 47, 91, 78]highest = scores[0]for i in range(1, len(scores)): if scores[i] > highest: highest = scores[i]print(highest) # 91Schritt für Schritt, in Worten
- Fünf Punktzahlen nebeneinander. Die Zahlen darunter sind die Indizes: von 0 bis 4.
- highest beginnt beim ersten: scores[0] ist 62.
- i = 1: 85 > 62, also wird highest zu 85.
- i = 2: 47 ist nicht größer als 85. Nichts ändert sich.
- i = 3: 91 > 85, also wird highest zu 91.
- i = 4: 78 < 91. range(1, len(scores)) ist zu Ende: Der Endwert 5 gehört nicht dazu, und die Schleife endet.
- Die höchste Punktzahl ist 91.
highest beginnt beim ersten Element und nicht bei 0. Wären alle Punktzahlen negativ, würde 0 „gewinnen“, obwohl sie gar nicht in der Liste steht. Deshalb beginnt die Schleife auch bei range(1, …): Das erste Element steckt schon in highest.
Probier es aus
Finde den Fehler
Das Programm soll die Summe 363 ausgeben. Stattdessen bricht es mit einem Fehler ab:
IndexError: list index out of rangeIn welcher Zeile ist der Fehler?
Wähle die Zeile mit dem Fehler.
range(1, len(scores) + 1) zählt von 1 bis 5, wie die Nummern der Schüler. Die Indizes einer Liste mit 5 Elementen gehen aber von 0 bis 4: scores[5] gibt es nicht, und das Programm bricht mit IndexError ab. Das nennt man über die Liste hinausgehen. Und scores[0] wäre übersprungen worden. Die Korrektur ist range(len(scores)).Die Idee
for … in: für jedes Element
Wenn du nur die Werte brauchst und nicht die Indizes, gibt es eine kürzere Schleife. Wie viele Schüler haben die Prüfung bestanden (60 Punkte oder mehr)?
scores = [62, 85, 47, 91, 78]passed = 0for score in scores: if score >= 60: passed += 1print(f"Prüfung bestanden: {passed}")Prüfung bestanden: 4Man liest sie so: „für jedes score in scores“. Das ist dasselbe for, nur geht es direkt durch die Elemente der Liste und nicht durch die Zahlen aus range. In Java heißt dasselbe for-each. Es gibt keinen Zähler und keinen Index, deshalb kannst du nicht über die Liste hinausgehen.
Es gibt aber auch eine Grenze: Du weißt nicht, bei welchem Index du bist, und du kannst das Element nicht ändern.
Genauer, für Neugierige
- Wenn du im Rumpf
score = 0schreibst, änderst du nur die Variablescore. Die Liste bleibt gleich, und Python hält dich nicht auf:
scores = [62, 85, 47]for score in scores: score = 0print(scores)[62, 85, 47]- Um Elemente zu ändern oder wenn du den Index brauchst (zum Beispiel für den Nachbarn
scores[i + 1]), nimmst du ein normalesfor.
Probier es aus
Zwei Namen, eine Liste
Was gibt das Programm aus?
prices = [10, 20, 30]sale = pricessale[0] = 5print(prices[0])b = a und danach b = 5 nichts an a. Bei einer Liste erzeugt sale = prices keine neue Liste, sondern gibt derselben Liste einen zweiten Namen. Deshalb sieht man eine Änderung über sale auch über prices. Warum das so ist, erfährst du im Modul „Klassen und Objekte“: Eine Liste ist ein Objekt, und die Variable zeigt darauf.Genauer, für Neugierige
Eine echte Kopie machst du mit einer neuen Liste und einer Schleife:
prices = [10, 20, 30]sale = []for price in prices: sale.append(price)sale[0] = 5print(prices[0], sale[0])10 5prices.copy() macht dasselbe:
prices = [10, 20, 30]sale = prices.copy()sale[0] = 5print(prices[0], sale[0])10 5Probier es aus
Bring die Zeilen in die richtige Reihenfolge
Das Programm soll den niedrigsten Preis finden. Bring seine Zeilen in die richtige Reihenfolge.
print(lowest)lowest = prices[0]prices = [18, 7, 25, 12]for i in range(1, len(prices)):if prices[i] < lowest:lowest = prices[i]
Übung
Rechnen mit einer Liste
Löse die Aufgaben in deinem Editor. Jedes Programm liest zuerst, wie viele Zahlen es sind, und dann die Zahlen selbst, eine pro Zeile:
n = int(input())numbers = []for i in range(n): numbers.append(int(input()))1. Summe, gerade, ungerade. Gib die Summe aller Zahlen aus, die Summe der geraden und die der ungeraden.
3123Summe: 6Gerade: 2Ungerade: 42. Umgekehrt. Lege zusätzlich eine Liste mit denselben Zahlen in umgekehrter Reihenfolge an und gib sie in einer Zeile aus.
5123455 4 3 2 13. Kleinste, größte, Durchschnitt. Mit einem einzigen Durchlauf durch die Liste, ohne die fertigen min, max und sum.
549274Kleinste: 2Größte: 9Durchschnitt: 5.2Übung
Sortieren und zählen
4. Sortieren. Sortiere die Zahlen von der kleinsten zur größten. Tipp: Geh durch die Liste, und wenn zwei Nachbarn in der falschen Reihenfolge stehen, vertausche sie (das Vertauschen kennst du aus der Lektion über Variablen). Wiederhole das, bis es nichts mehr zu vertauschen gibt. Das nennt man Bubblesort: Die großen Zahlen „steigen“ wie Blasen ans Ende. Nimm nicht das fertige numbers.sort(): Das Ziel ist, es selbst zu schreiben.
5427193253 7 19 25 425. Längste Folge. Finde die längste Folge gleicher Zahlen direkt hintereinander.
822555155Die Zahl 5, 3-mal hintereinander6. Notenstatistik. Lies Noten von 2 bis 6 ein und gib aus, wie viele es von jeder Note gibt. Tipp: eine Liste counts mit 7 Elementen, in dem die Note der Index ist: counts[grade] += 1.
864563265Ausgezeichnet (6): 3Sehr gut (5): 2Gut (4): 1Ausreichend (3): 1Ungenügend (2): 1Weitere Aufgaben
- Median. Die Zahl in der Mitte der sortierten Liste. Für 3, 1, 4, 1, 5 ist der Median 3. Bei einer geraden Anzahl von Zahlen ist der Median der Durchschnitt der beiden in der Mitte: Für 7, 1, 3, 9 ist er (3 + 7) / 2 = 5.
- Symmetrische Liste. Liest es sich von vorne nach hinten genauso wie von hinten nach vorne? 1 2 3 2 1 ist symmetrisch, 1 2 3 1 nicht.
- Römische Zahlen. Lies eine Zahl von 1 bis 3999 ein und gib sie in römischen Zahlen aus: 2024 ist MMXXIV, 1994 ist MCMXCIV. Tipp: zwei Listen nebeneinander, eines mit den Werten
1000, 900, 500, 400, 100, …, 1und eines mit den Zeichen"M", "CM", "D", "CD", "C", …, "I". Solange die Zahl mindestens so groß ist wie der aktuelle Wert, hängst du das Zeichen an und ziehst den Wert ab.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Eingabe und Ausgabe · Operatoren und Arithmetik · Bedingungen · Schleifen
- Geht weiter in: Zweidimensionale Arrays · Strings: mit Text arbeiten · Parameter und return · Standardwerte
- Aufgaben zum Thema: Sprachgrundlagen