Kapitel 03

Listen

Sammlungen von Werten, Indexzugriff und for-in-Schleifen.

Listen sind Sammlungen von Werten in einer bestimmten Reihenfolge. Der folgende Code zeigt ein Beispiel einer Liste in Python:

python["apple", "orange", "pear", "strawberry"]

Man erstellt eine Liste, indem man beliebig viele Werte durch ein Komma getrennt in ein Paar eckiger Klammern schreibt. Die Elemente einer Liste können auch Zahlen oder Wahrheitswerte sein, und sie darf sogar leer sein:

pythona = [1, 42, 15, 777, 15, 9]
b = [True, False, False]
c = []

Die Reihenfolge der Elemente in einer Liste spielt eine Rolle.

Die eckigen Klammern können auf schweizer Tastaturen mit Alt Gr + ü (für [) und Alt Gr + ¨ (für ]) eingegeben werden.
Aufgabe 1

len(...) und sum(...)

Gegeben seien folgende vier Listen:

pythonli1 = [0,1,2,3,4]
li2 = [5,10,-20]
li3 = ["Alice", "Bob"]
li4 = []

Rufen Sie den Befehl len(...) einmal mit jeder dieser Listen auf und geben Sie das Ergebnis mit print(...) aus. Was macht len(...)?

Wiederholen Sie das Experiment mit sum(...). Was macht dieser Befehl?

Für welche Listen lässt sich sum(...) nicht ausführen, und warum nicht?

Aufgabe 2

mean(...) mit Listen

Definieren Sie eine Funktion mean(...), die für eine beliebige Liste von Zahlen den Mittelwert ausgibt. len() und sum() könnten nützlich sein.

pythondef mean(li):
    # Ihr Code hier

nums1 = [0,1,2,3,4]
nums2 = [5,5,5]
nums3 = [0,1,2,13]
print(mean(nums1)) # 2.0
print(mean(nums2)) # 5.0
print(mean(nums3)) # 4.0
Musterlösung
pythondef mean(li):
    return sum(li) / len(li)

nums1 = [0,1,2,3,4]
nums2 = [5,5,5]
nums3 = [0,1,2,13]
print(mean(nums1))
print(mean(nums2))
print(mean(nums3))
Aufgabe 3

Befehle mit Listen

Welche der vorhergehenden Befehle, die als Argument eine Liste erwarten, sind Funktionen, welche Prozeduren?

BefehlProzedurFunktion
len()
sum()
mean()

Index und Existenzüberprüfung

Jedes Element einer Liste hat eine Position, genannt Index. Das erste Element hat den Index 0 (nicht 1!). Mit simpsons[1] greift man auf das zweite Element zu.

pythonsimpsons = ["Homer", "Bart", "Marge", "Lisa"]
print("Hallo, " + simpsons[1])

Man kann mit dieser Schreibweise Elemente auch verändern, und mit dem Schlüsselwort in prüfen, ob ein Element in einer Liste vorkommt:

pythonif "Marge" in simpsons:
    print("Marge ist dabei")
Aufgabe 4

Zugriff über den Index

Versuchen Sie zu erraten, welche Ausgaben die print-Anweisungen in folgendem Programm produzieren:

pythonsimpsons = ["Marge", "Bart", "Lisa", "Milhouse"]
farben = ["green", "red", "orange"]

print(farben[2])
print(simpsons[2+4-5])
print(simpsons[-2])
print(farben[0])
print(farben[-1])
print(farben[0] == "green")
print(farben)
CodeVermutete Ausgabe
print(farben[2])
print(simpsons[2+4-5])
print(simpsons[-2])
print(farben[0])
print(farben[-1])
print(farben[0] == "green")
print(farben)

Wie sind negative Indexe, z.B. bei print(simpsons[-2]), zu interpretieren?

Aufgabe 5

Existenz überprüfen

Schreiben Sie ein Programm, das den Benutzer um ein Land (auf Englisch) als Eingabe bittet und sagt, ob es sich um ein afrikanisches Land handelt.

pythonafrica = ["Nigeria", "Ethiopia", "Egypt", "DR Congo", "Tanzania", "South Africa", "Kenya", "Uganda", "Sudan", "Algeria", "Morocco", "Angola", "Ghana", "Mozambique", "Madagascar", "Ivory Coast", "Cameroon", "Niger", "Mali", "Burkina Faso", "Malawi", "Zambia", "Chad", "Somalia", "Senegal", "Zimbabwe", "Guinea", "Rwanda", "Benin", "Burundi", "Tunisia", "South Sudan", "Togo", "Sierra Leone", "Libya", "Republic of the Congo", "Central African Republic", "Liberia", "Mauritania", "Eritrea", "Gambia", "Botswana", "Namibia", "Gabon", "Lesotho", "Guinea-Bissau", "Equatorial Guinea", "Mauritius", "Eswatini", "Djibouti", "Comoros", "Cape Verde", "Western Sahara", "São Tomé and Príncipe", "Seychelles"]

Welche dieser Länder liegen in Afrika?

LandIn Afrika?
Martinique
Mozambique
Togo
Tonga
Gambia
Zambia
Musterlösung
pythoncountry = input("Which country?")
if country in africa:
    print(country + " is in Africa")
else:
    print(country + " is NOT in Africa")

Listen verändern

Python stellt verschiedene Befehle zur Verfügung, um Listen zu verändern:

BefehlBeispielBeschreibung
append()simpsons.append("Milhouse")Fügt "Milhouse" ganz rechts der Liste hinzu.
remove()simpsons.remove("Bart")Entfernt die erste Kopie von "Bart".
pop()simpsons.pop(1)Entfernt das Element an Index 1 (ohne Index: das letzte). Rückgabewert ist das entfernte Element.
Beachten Sie die ungewöhnliche Schreibweise: Statt mit dem Befehlsnamen anzufangen, schreibt man den Namen der Liste gefolgt von einem Punkt und dem Befehlsnamen.
Aufgabe 6

Listen verändern

Wandeln Sie die Liste ["a","b","c"] in die Liste ["b","d"] um. Verwenden Sie dabei jeden dieser Befehle genau einmal:

  • liste.append(element)
  • liste.remove(element)
  • liste.pop()
Musterlösung
pythonliste = ["a", "b", "c"]
liste.pop()
liste.remove("a")
liste.append("d")
print(liste)
Aufgabe 7

Liste anpassen mit Buzz

Buzz Lightyear versucht, seine Energiestufen in der richtigen Reihenfolge zu organisieren.

pythonenergy_levels = [3, 2, 1]

Buzz möchte sie in aufsteigender Reihenfolge [1, 2, 3] haben. Verwenden Sie Listenoperationen, um die Liste entsprechend zu ändern.

Musterlösung
pythonenergy_levels = [3, 2, 1]

energy_levels.append(energy_levels.pop(1))
energy_levels.append(energy_levels.pop(0))
print(energy_levels)
Aufgabe 8

Mr. Incredible und Elastigirl

Mr. Incredible und Elastigirl tracken ihre Erfolge in der Liste wins:

pythonwins = ["Elastigirl", "Mr. Incredible", "Mr. Incredible", "Elastigirl", "Elastigirl", "Mr. Incredible"]

wins.remove("Mr. Incredible")
wins.append("Elastigirl")
wins.append("Elastigirl")
wins.remove("Elastigirl")
wins.remove("Elastigirl")
wins.pop()
print(wins)

Was schreibt das Programm in die Ausgabe? Geben Sie die Lösung als Folge der Grossbuchstaben M (Mr. Incredible) und E (Elastigirl) ein.

Aufgabe 9

Liste für Zaubertrankformel

Hermione Granger verbessert eine Zaubertrankformel. Die Liste soll die vier kleinsten Primzahlen enthalten, hat aber zwei Fehler:

pythonprimes = [1, 2, 3, 4, 7] # Definition der Liste

a) Korrigieren Sie die Fehler in primes nur durch den Zugriff auf die Indizes. Ändern Sie nichts an der ursprünglichen Definition.

b) Schreiben Sie das letzte Element der korrigierten Liste in die Ausgabe.

Musterlösung
pythonprimes = [1, 2, 3, 4, 7]

primes.pop(0)
primes[-2] = 5
print(primes[-1])
Aufgabe 10

Die Gästeliste des Prinzen

Cinderella

Der Prinz organisiert einen Ball. Sein Empfangs-Team benötigt ein Programm, das am Eingang die ankommenden Gäste erfasst.

  1. Das Programm fragt, wie viele Gäste eingeladen wurden (n).
  2. Es fordert bis zu n Mal auf, den Namen des nächsten Gasts einzugeben. Bei leerer Eingabe bricht es ab.
  3. Es gibt aus, wie viele Gäste nicht gekommen sind («There are X no-shows.»).
  4. Zum Schluss prüft es, ob "Cinderella" auf der Gästeliste steht.
Musterlösung
pythonn = input("How many guests?")
guests = []
repeat n:
    guest = input("Next guest?")
    if guest == "":
        break
    else:
        guests.append(guest)
no_shows = n - len(guests)
print("There are " + str(no_shows) + " no-shows.")
if "Cinderella" in guests:
    print("Cinderella is among the guests")
else:
    print("Cinderella is NOT among the guests")
Challenge

Last-in-first-out

Jeden Abend macht sich Fritzchen zum Schlafen parat. Er zieht seine Kleider aus und legt sie in den Kleiderschrank. Am Morgen zieht er sie wieder an — in umgekehrter Reihenfolge.

Sie dürfen die Wörter Mütze, Jacke, Socken, Schuhe nur in der ersten Zeile verwenden.

pythonfritz = [ "Socken", "Schuhe", "Jacke", "Mütze" ]
closet = []

print("Fritzchen geht schlafen. Er zieht...")
repeat len(fritz):
    item = "Mütze"
    print("...seine " + item + " aus")

print("Fritzchen wacht auf. Er zieht...")
repeat len(closet):
    item = "Socken"
    print("...seine " + item + " an")
Musterlösung
pythonfritz = [ "Socken", "Schuhe", "Jacke", "Mütze" ]
closet = []

print("Fritzchen geht schlafen. Er zieht...")
repeat len(fritz):
    item = fritz.pop()
    print("...seine " + item + " aus")
    closet.append(item)

print("Fritzchen wacht auf. Er zieht...")
repeat len(closet):
    item = closet.pop()
    print("...seine " + item + " an")
    fritz.append(item)
Aufgabe 12

Listen mit Index verändern

Folgenden englischen Zeitungsüberschriften sind peinliche Schreibfehler unterlaufen:

Congrats to our Home Run Hitler!
School Two Easy For Kids?
Powered by lithium batteries, you'll always be ready for a sh*t.
Illegally Parked Cars Will Be Fine

Korrigieren Sie die Überschriften mit Indexzugriff auf eine Liste von Buchstaben (list(headline)), und wandeln Sie das Ergebnis mit "".join(letters) zurück.

Musterlösung
pythonheadline1 = "Congrats to our Home Run Hitler!"
letters = list(headline1)
letters[-4] = "t"
headline1 = "".join(letters)

headline2 = "School Two Easy For Kids?"
letters = list(headline2)
letters[8] = "o"
headline2 = "".join(letters)

headline4 = "Illegally Parked Cars Will Be Fine"
letters = list(headline4)
letters.append("d")
headline4 = "".join(letters)

print(headline1)
print(headline2)
print(headline4)

Listen mit for-in durchlaufen

Mit der folgenden Schleife können die Elemente einer Liste durchlaufen werden:

pythonsimpsons = ["Homer", "Marge", "Bart", "Lisa"]

for x in simpsons:
    print("Hallo", x)

Der Körper dieser Schleife wird für jedes Element einmal ausgeführt. Die Schleifenvariable x bekommt in jeder Iteration den Wert des aktuellen Elements.

Aufgabe 13

Farbige Zeichnung

Was zeichnet dieses Programm?

pythonfrom gturtle import *

makeTurtle()
setPenWidth(20)

colors = ["red", "orange", "yellow", "green", "blue", "indigo", "violet"]
for color in colors:
    setPenColor(color)
    forward(100)
    back(100)
    penUp()
    right(90)
    forward(20)
    left(90)
    penDown()

Schreiben Sie Ihre Vermutung auf:

Wie heisst die Schleifenvariable dieses Programms?

Aufgabe 14

Listen durchlaufen

Durchlaufen Sie die Liste [0,1,2,10,-5,3] in einer Schleife und geben Sie für jede Zahl x ihr Quadrat aus. Tipp: x**2.

Musterlösung
pythonfor x in [0,1,2,10,-5,3]:
    print(x**2)
Aufgabe 15

Liste mit Gturtle-Argumenten

a) Rufen Sie abwechselnd right() und forward() auf. Übergeben Sie als Winkel der Reihe nach alle Elemente aus:

pythonturns = [180, 30, 120, 30, 150, 240]

Die Geraden sind alle 100 Pixel lang.

b) Dasselbe, aber mit zwei Listen:

pythonturns = [0, 45, 90, 45, 90, 135, 225, 225]
lengths = [90, 63, 63, 90, 90, 126, 90, 126]

Tipp: Hilfsliste i_s = [0, 1, 2, 3, 4, 5, 6, 7].

Musterlösung
pythonfrom gturtle import *

turns = [180, 30, 120, 30, 150, 240]
makeTurtle()

for t in turns:
    right(t)
    forward(100)
pythonfrom gturtle import *

turns = [0, 45, 90, 45, 90, 135, 225, 225]
lengths = [90, 63, 63, 90, 90, 126, 90, 126]
makeTurtle()

i_s = [0, 1, 2, 3, 4, 5, 6, 7]

for i in i_s:
    t = turns[i]
    l = lengths[i]
    right(t)
    forward(l)
Challenge

Listen von Listen durchlaufen

Listen können auch Listen als Elemente haben. So entstehen zweidimensionale Strukturen:

pythondata = [
[False, False, True, True, True, True, False, False],
[False, True, False, False, False, False, True, False],
[True, False, False, True, True, False, False, True],
[True, False, True, False, False, True, False, True],
[True, False, False, False, False, False, False, True],
[True, False, True, False, False, True, False, True],
[True, False, False, False, False, False, False, True],
[False, True, False, False, False, False, True, False],
[False, False, True, True, True, True, False, False],
]

Zeichnen Sie mit setPos(x,y) und dot(10) pro Element einen Punkt: schwarz für True, hellgrau für False. Welches Symbol erkennen Sie?

Musterlösung
pythonfrom gturtle import *

makeTurtle()

x = 0
y = 0
for row in data:
    y += 1
    x = 0
    for point in row:
        x += 1
        if point == True:
            setPenColor("black")
        else:
            setPenColor("lightgray")
        setPos(10 * x, 10 * y)
        dot(10)

Es wird mit Punkten ein Smiley gemalt.

Aufgabe 17

Anagramme

Zwei Texte sind Anagramme, wenn der eine durch Umstellung der Buchstaben des anderen gebildet werden kann. Schreiben Sie ein Programm, das zwei Zeichenketten auf Anagramm-Eigenschaft prüft.

Testen Sie mit: goal/go, gallery/allergy, moonstarer/astronomer, silent/listen, softest heart/earth forests, the morse code/here come dots, presbyterians/britneyspears.

Musterlösung
pythona = input("First word")
b = input("Second word")

aLetters = list(a)
bLetters = list(b)

if len(aLetters) == len(bLetters):
    for x in aLetters:
        if x in bLetters:
            bLetters.remove(x)
    if len(bLetters) == 0:
        print(a,"and",b,"are anagrams")
    else:
        print(a,"and",b,"are NOT anagrams")
else:
    print(a,"and",b,"are NOT anagrams")
Challenge

Nachrücken — Ein Gast bei den Simpsons

Simpsons couch

Die Simpsons sitzen auf der Couch, als es an der Tür läutet. Bart steht auf und ein Gast darf sich auf die Couch setzen.

  • Definiere eine Liste names.
  • Frage nach dem Namen des Besuchers.
  • Frage, an welchem Index er sitzen will.
  • Nachdem Bart aufgestanden ist, rücken alle nach rechts, um den Platz freizumachen.
  • Der Gast setzt sich; das Programm gibt die neue Liste aus.
Beispiel: Milhouse und 2 ergeben ['Homer', 'Marge', 'Milhouse', 'Lisa', 'Maggie'].
Musterlösung
pythonnames = ["Homer", "Marge", "Lisa", "Maggie", "Bart"]

guest = input("Wer ist der Gast?")
guestIndex = input("An welchem Index soll er/sie sitzen?")

i = len(names) - 1
repeat len(names) - guestIndex - 1:
    names[i] = names[i-1]
    i -= 1

names[guestIndex] = guest
print(names)
Aufgabe 19

Kleinste Zahl in Liste finden

Schreiben Sie ein Programm, das für eine Liste mit Zahlen die kleinste Zahl (das Minimum) ausgibt. Setzen Sie minimum zunächst auf das erste Element und durchlaufen Sie die Liste mit einer for-in-Schleife.

Musterlösung
pythonzahlen = [1, -7, 42, -13, 81, 7]

minimum = zahlen[0]

for z in zahlen:
    if z < minimum:
        minimum = z
print(minimum)
Aufgabe 20

Simpsons mit Haustieren

Simpsons pets

Erstellen Sie eine Liste simpsons. Durchlaufen Sie sie und erstellen Sie eine neue Liste simpsons_with_pets, bei der zusätzlich die Haustiere dazukommen:

  • Der Hund (Dog) kommt direkt nach Homer.
  • Die Katze (Cat) kommt direkt nach Lisa.
Simpsons couch with pets
Musterlösung
pythonsimpsons = ["Homer", "Marge", "Lisa", "Maggie", "Bart"]
simpsons_with_pets = []

for person in simpsons:
    simpsons_with_pets.append(person)
    if person == "Homer":
        simpsons_with_pets.append("Dog")
    elif person == "Lisa":
        simpsons_with_pets.append("Cat")

print(simpsons_with_pets)
Aufgabe 21

Fibonacci-Folge generieren

Fibonacci

Die Fibonacci-Folge beginnt mit 1, 1, 2, 3, 5, 8, 13, …. Jedes Folgenglied (ab dem dritten) ist die Summe der zwei vorangehenden. Fügen Sie zur Liste fibonacci = [1, 1] die nächsten 18 Fibonacci-Zahlen hinzu.

Musterlösung
pythonfibonacci = [1, 1]

repeat 18:
    next = fibonacci[-1] + fibonacci[-2]
    fibonacci.append(next)
print(fibonacci)
Challenge

Fibonacci-Spirale visualisieren

Die Fibonacci-Folge kann als Spirale aus Viertelkreisen visualisiert werden. Der Radius des n-ten Viertelkreises ist die n-te Fibonacci-Zahl.

Fibonacci-Spirale
  • Definieren Sie einen Befehl viertelkreis(r) für einen Viertelkreis mit Radius r.
  • Zeichnen Sie 90 kleine Striche der Länge 2*pi*r/360 und drehen Sie jeweils um 1°.
  • Durchlaufen Sie die Fibonacci-Liste und rufen Sie viertelkreis(f) für jede Zahl auf.

Tipp: from math import pi und from gturtle import *.

Musterlösung
pythonfrom gturtle import *
from math import *

def viertelkreis(r):
    repeat 90:
        forward(2 * pi * r / 360)
        right(1)

fibonacci = [1, 1]
repeat 18:
    next = fibonacci[-1] + fibonacci[-2]
    fibonacci.append(next)

speed(-1)
for f in fibonacci:
    viertelkreis(f)
Aufgabe 23

Einkaufsliste

Einkaufsliste

Wir schreiben eine einfache Einkaufslisten-App. Startpunkt: shopping_list = [].

a) add(): fragt nach einem Produkt und fügt es hinzu (nicht mehrfach).

b) delete(): fragt nach einem Produkt und entfernt es. Wenn nicht vorhanden: Fehlermeldung «X isn't on the shopping list!».

c) show(): zeigt alle Elemente mit Index an, am Ende «--------------------»; bei leerer Liste «The list is empty».

d) Hauptprogramm: Endlosschleife mit den Kommandos add, delete, show, quit. Unbekanntes Kommando → «Invalid command».

Musterlösung
pythonshopping_list = []

def add():
    product = input("Which Product?")
    if not product in shopping_list:
        shopping_list.append(product)

def delete():
    product = input("Which Product?")
    if not product in shopping_list:
        print(product + " isn't on the shopping list!")
    else:
        shopping_list.remove(product)

def show():
    if len(shopping_list) == 0:
        print("The list is empty")
    else:
        i = 0
        repeat len(shopping_list):
            print(i, shopping_list[i])
            i += 1
        print("--------------------")

repeat:
    command = input("Command?")
    if command == "add":
        add()
    elif command == "delete":
        delete()
    elif command == "show":
        show()
    elif command == "quit":
        break
    else:
        print("Invalid command")