Einführung in Listen
Aufgabe 1: Zwei Wege zum selben Bild
a) Analysiere die beiden folgenden Beispiele nacheinander. Beide erzeugen dasselbe Bild.
b) Formuliere Vermutungen über die neuen Aspekte im zweiten Beispiel: Was ist neu? Was wird damit gemacht? Was bewirken die neuen Schreibweisen?
c) Begründe, warum das zweite Beispiel besser umgesetzt ist.
Erstes Beispiel – mit einzelnen Variablen
Zweites Beispiel – mit einer Liste
- Eine Liste speichert mehrere Werte unter einem Namen:
hoehen = [40, 60, 20, 100, 80] - Die einzelnen Werte heißen Elemente. Auf sie greifst du über ihre Position zu:
hoehen[0],hoehen[1], … - Gezählt wird ab 0! Das erste Element ist
hoehen[0], das fünftehoehen[4]. len(hoehen)liefert die Länge der Liste, hier also 5.- Der letzte gültige Index ist deshalb immer
len(liste) - 1.
Warum wird ab 0 gezählt? Das wirkt zunächst unlogisch, hat aber einen historischen Grund: Der Index gibt eigentlich an, wie weit ein Element vom Listenanfang entfernt ist. Das erste Element steht direkt am Anfang – der Abstand ist also 0.
Fast alle Programmiersprachen machen es so. Gewöhne dich früh daran, dann ersparst du dir viele Fehler.
Auflösung zu c)
Das zweite Beispiel ist aus mehreren Gründen besser:
- Es ist viel kürzer. Der Zeichenvorgang steht nur einmal da statt fünfmal.
- Es ist leichter zu ändern. Willst du eine sechste Säule, ergänzt du eine Zahl in der Liste – mehr nicht.
- Es ist weniger fehleranfällig. Beim Kopieren des Blocks im ersten Beispiel vergisst man leicht,
hoehe1inhoehe2zu ändern. - Die Anzahl ist flexibel. Durch
len(hoehen)passt sich die Schleife automatisch an.
Aufgabe 2: Punkte aus einer Liste
In einem Programm wird diese Liste vorgegeben:
durchmesser = [50, 80, 40, 100, 40]
Zeichne mithilfe einer Schleife Punkte mit den entsprechenden Durchmessern nebeneinander.
Tipp: Der Aufbau der Schleife
Übernimm den Aufbau aus dem Säulen-Beispiel:
zaehler = 0
while zaehler < len(durchmesser):
dot(durchmesser[zaehler])
forward(90)
zaehler = zaehler + 1
from turtle import *
shape("turtle")
screensize(600, 260)
durchmesser = [50, 80, 40, 100, 40]
penup()
goto(-180, 0)
zaehler = 0
while zaehler < len(durchmesser):
dot(durchmesser[zaehler])
forward(90)
zaehler = zaehler + 1
Aufgabe 3: Zwei Listen gleichzeitig
Nun werden gleich zwei Listen vorgegeben:
durchmesser = [50, 80, 40, 80, 40]
hoehen = [40, 60, 20, 100, 80]
Zeichne damit Bäume wie unten abgebildet. Der erste Baum hat also eine Krone mit Durchmesser 50 auf einem 40 Pixel hohen Stamm.
Tipp: Ein Zähler für beide Listen
Beide Listen sind gleich lang und gehören zusammen: Der Baum Nummer zaehler hat die Krone durchmesser[zaehler] und den Stamm hoehen[zaehler].
Du brauchst also nur einen Zähler für beide Listen.
from turtle import *
shape("turtle")
screensize(700, 340)
speed(0)
durchmesser = [50, 80, 40, 80, 40]
hoehen = [40, 60, 20, 100, 80]
penup()
goto(-240, -120)
zaehler = 0
while zaehler < len(hoehen):
setheading(90)
pensize(12)
pencolor("brown")
pendown()
forward(hoehen[zaehler])
pencolor("green")
dot(durchmesser[zaehler])
penup()
backward(hoehen[zaehler])
setheading(0)
forward(110)
zaehler = zaehler + 1
Aufgabe 4: Mit Listen arbeiten
Beschreibe, wie man die folgenden Punkte in einem Programm jeweils umsetzen kann. Teste es im Zweifel am Rechner.
- Die Länge einer Liste soll angezeigt werden.
- Die komplette Liste soll angezeigt werden.
- Der allererste Eintrag soll als einziger angezeigt werden.
- Ein Eintrag soll einen neuen Wert erhalten.
zahlen = [40, 60, 20, 100, 80]
print(len(zahlen)) # Länge: 5
print(zahlen) # die ganze Liste
print(zahlen[0]) # nur der erste Eintrag: 40
zahlen[2] = 999 # der dritte Eintrag bekommt einen neuen Wert
print(zahlen)
Aufgabe 5: Texte in Listen
Man kann auch Texte in Listen speichern:
farben = ["red", "green", "red", "blue", "magenta"]
Zeichne mithilfe dieser Liste verschiedenfarbige Punkte wie unten abgebildet.
Aufgabe 6: Wahrheitswerte in Listen
In dieser Aufgabe wird eine Liste mit Wahrheitswerten vorgegeben:
baum = [True, True, False, True, True, False, False, True]
Damit soll eine Reihe von Bäumen gezeichnet werden. True steht für einen Baum, False für eine Lücke in der Reihe.
Entwickle ein geeignetes Programm.
Tipp 1: Zwei Konzepte kombinieren
Hier kommen Listen und Verzweigungen zusammen: In der Schleife fragst du ab, ob an dieser Stelle ein Baum stehen soll.
if baum[zaehler]:
# Baum zeichnen
Tipp 2: Die Lücke nicht vergessen
Wichtig: Die Turtle muss immer weiterrücken – auch dann, wenn kein Baum gezeichnet wurde. Sonst rutschen die folgenden Bäume zusammen.
Das Weiterrücken gehört also außerhalb der if-Abfrage, aber innerhalb der Schleife.
Aufgabe 7: Das Maximum finden
Gegeben ist die folgende Vorlage. Ergänze den fehlenden Programmtext so, dass am Ende in der Variablen maximum immer die größte Zahl der Liste steht.
Teste deine Lösung mit verschiedenen Werten in der Liste.
Tipp 1: Die Idee
Stell dir vor, du gehst mit einem Zettel an einer Reihe von Personen entlang und willst die größte finden.
Auf dem Zettel steht immer die bisher größte Körpergröße. Bei jeder neuen Person vergleichst du – und schreibst nur dann etwas Neues auf, wenn sie größer ist.
Tipp 2: Als Code
if zahlen[zaehler] > groesstes:
groesstes = zahlen[zaehler]
def maximum(zahlen):
groesstes = 0
zaehler = 0
while zaehler < len(zahlen):
if zahlen[zaehler] > groesstes:
groesstes = zahlen[zaehler]
zaehler = zaehler + 1
return groesstes
Zusatzaufgabe: Ein Problem mit negativen Zahlen
Das Programm aus Aufgabe 7 liefert möglicherweise falsche Werte, wenn die Liste ausschließlich negative Zahlen enthält.
a) Probiere es aus: Was liefert deine Lösung für [-5, -20, -3]? Was wäre richtig?
b) Erkläre, woran das liegt.
c) Modifiziere das Programm so, dass es auch dann das korrekte Ergebnis liefert.
Tipp zu b)
Die Startbelegung groesstes = 0 behauptet im Grunde: „Ich habe schon eine Zahl gesehen, nämlich die 0." Das ist aber gar nicht wahr – und die 0 ist größer als jede negative Zahl.
Tipp zu c)
Belege groesstes nicht mit 0, sondern mit dem ersten Element der Liste. Das ist garantiert eine Zahl, die wirklich vorkommt.
groesstes = zahlen[0]