Zum Inhalt
wannacode

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 = 62
score2 = 85
score3 = 47
score4 = 91
score5 = 78
total = score1 + score2 + score3 + score4 + score5
print(total)
Ausgabe
363

In 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] = 50
print(scores[2])
Ausgabe
62
78
5
50
  • 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] * 3
booked[1] = 2
print(booked)
Ausgabe
[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))
Ausgabe
[62, 85, 47]
3

print 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])
Ausgabe
78
91

Probier es aus

Welches ist welches?

Was gibt das Programm aus?

prices = [12, 7, 30, 5]
print(prices[1] + prices[3])
Antwort

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 = 0
for i in range(len(scores)):
total += scores[i]
print(f"Summe: {total}")
print(f"Durchschnitt: {total / len(scores)}")
Ausgabe
Summe: 363
Durchschnitt: 72.6

Der 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))
Ausgabe
363 91 47

Sieh 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) # 91
Schritt für Schritt, in Worten
  1. Fünf Punktzahlen nebeneinander. Die Zahlen darunter sind die Indizes: von 0 bis 4.
  2. highest beginnt beim ersten: scores[0] ist 62.
  3. i = 1: 85 > 62, also wird highest zu 85.
  4. i = 2: 47 ist nicht größer als 85. Nichts ändert sich.
  5. i = 3: 91 > 85, also wird highest zu 91.
  6. i = 4: 78 < 91. range(1, len(scores)) ist zu Ende: Der Endwert 5 gehört nicht dazu, und die Schleife endet.
  7. 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:

Fehler
IndexError: list index out of range

In welcher Zeile ist der Fehler?

Wähle die Zeile mit dem Fehler.

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 = 0
for score in scores:
if score >= 60:
passed += 1
print(f"Prüfung bestanden: {passed}")
Ausgabe
Prüfung bestanden: 4

Man 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 = 0 schreibst, änderst du nur die Variable score. Die Liste bleibt gleich, und Python hält dich nicht auf:
scores = [62, 85, 47]
for score in scores:
score = 0
print(scores)
Ausgabe
[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 normales for.

Probier es aus

Zwei Namen, eine Liste

Was gibt das Programm aus?

prices = [10, 20, 30]
sale = prices
sale[0] = 5
print(prices[0])
Antwort
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] = 5
print(prices[0], sale[0])
Ausgabe
10 5

prices.copy() macht dasselbe:

prices = [10, 20, 30]
sale = prices.copy()
sale[0] = 5
print(prices[0], sale[0])
Ausgabe
10 5

Probier es aus

Bring die Zeilen in die richtige Reihenfolge

Das Programm soll den niedrigsten Preis finden. Bring seine Zeilen in die richtige Reihenfolge.

  1. print(lowest)
  2. lowest = prices[0]
  3. prices = [18, 7, 25, 12]
  4. for i in range(1, len(prices)):
  5. if prices[i] < lowest:
  6. 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.

Eingabe
3
1
2
3
Ausgabe
Summe: 6
Gerade: 2
Ungerade: 4

2. Umgekehrt. Lege zusätzlich eine Liste mit denselben Zahlen in umgekehrter Reihenfolge an und gib sie in einer Zeile aus.

Eingabe
5
1
2
3
4
5
Ausgabe
5 4 3 2 1

3. Kleinste, größte, Durchschnitt. Mit einem einzigen Durchlauf durch die Liste, ohne die fertigen min, max und sum.

Eingabe
5
4
9
2
7
4
Ausgabe
Kleinste: 2
Größte: 9
Durchschnitt: 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.

Eingabe
5
42
7
19
3
25
Ausgabe
3 7 19 25 42

5. Längste Folge. Finde die längste Folge gleicher Zahlen direkt hintereinander.

Eingabe
8
2
2
5
5
5
1
5
5
Ausgabe
Die Zahl 5, 3-mal hintereinander

6. 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.

Eingabe
8
6
4
5
6
3
2
6
5
Ausgabe
Ausgezeichnet (6): 3
Sehr gut (5): 2
Gut (4): 1
Ausreichend (3): 1
Ungenügend (2): 1

Weitere 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, …, 1 und 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

1. An welchem Index steht 91 in der Liste [62, 85, 47, 91, 78]?
2. Welchen Index hat das letzte Element der Liste scores?
3. Was steht in der Liste direkt nach booked = [0] * 3?
4. Die Schleife ist for i in range(len(scores) + 1): und liest scores[i]. Was passiert?
5. sale = prices, danach sale[0] = 5. Was passiert mit prices[0]?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·