Der Python-Kurs: Listen
Willemers Informatik-Ecke
Tupel Python-Kurs Dictionary

Mehrere Daten können in einer Liste zusammengefasst werden. Eine solche Liste kann verlängert oder verkürzt werden. Die Elemente einer Liste können nachträglich verändert werden.

Texte (Zeichenketten oder Strings) können - mit Einschränkungen - als Listen von Buchstaben behandelt werden.

Eine Liste definieren und darauf zugreifen

Das syntaktische Merkmal einer Liste ist die rechteckige Klammer. Der Befehl type liefert den Typ list.
>>> type([1, 4, 7, 12, 23, 49])
<class 'list'>

Eine vorbelegte Liste für die Lottozahlen

Eine Liste ist eine Variable, die mehrere Elemente enthält. Ein typisches Beispiel für eine Liste mit sechs Elementen sind die Lottozahlen. Man kann diese definieren, in dem man sie kommasepariert aufzählt und mit eckigen Klammern versieht.
lotto = [1, 4, 7, 12, 23, 49]
Die Variable lotto verweist nun auf eine Liste von sechs Zahlen.

Man kann die Liste mit der Funktion print wieder auf dem Bildschirm anzeigen.

print(lotto)
Die Ausgabe zeigt die Liste der Lottozahlen von rechteckigen Klammern umgeben:
[1, 4, 7, 12, 23, 49]

Einzelne Listenelemente herausgreifen

Auf die Elemente der Liste kann über einen Index zugegriffen werden. Der Index wird dazu in rechteckige Klammern eingeschlossen und an die Listenvariable angehängt.
print(lotto[1])
Es erscheint 4 auf dem Bildschirm, weil lotto[1] das zweite Element ist. Tatsächlich beginnt der Index bei einer Liste immer mit 0. Das erste Element lotto[0] enthält eine 1. lotto[1] ist also das zweite Element und enthält 4.

Sollte die 4 nicht gefallen, kann sie durch eine 3 ersetzt werden.

lotto[1] = 3
Ein Zugriff über den Rand der Liste hinaus wird durch Programmabbruch bestraft. Der Versuch, auf lotto[6] anzuzeigen, gelingt nicht, weil es bereits das siebte Element ist, lotto aber nur sechs Elemente enthält.

Die Lottozahlen können mit einer for-Schleife ausgelesen werden. Dabei wird der Variable i bei jedem Durchlauf nacheinander das nächste Element der Liste zugewiesen.

Lottozahlen = [ 7, 17, 24, 28, 29, 31 ]
for i in Lottozahlen:
    print(i)

Listen ohne Literal anlegen

Will man die Lottozahlen nicht einfach festgelegt, sondern später zufällig erzeugen, kann man auch eine Liste anlegen, die sechs Nullen enthält. Um nicht alle Nullen aufzählen zu müssen, kann auch das Multiplikationszeichen verwendet werden.
lotto = [0]*6
Auch hier gilt, dass die Liste anschließend sechs Elemente enthält, die über die Indizes 0 bis 5 zugegriffen werden können. Ein Übergriff auf das siebte Element mit Index 6 ist verboten.

Listen erweitern

In Python ist es möglich, die Listen durch den Aufruf von append zu erweitern. Das folgende Programm definiert eine leere Liste und fügt sechs Mal eine neue Zahl an.
lotto = []
for i in range(6):
    lotto.append(i*5)
Der Inhalt wird [ 0, 5, 10, 15, 20, 25 ] sein. Das liegt daran, dass auch range beim Zählen mit 0 beginnt.

Bei append handelt es sich um eine Funktion. Diese kann aufgerufen werden, so wie auch print. Die Klammern enthalten die Parameter, die an die Funktion übergeben werden.

Die Funktion append wird über die Listenvariable aufgerufen. So wird ausgedrückt, dass sich append auf diese Liste auswirkt. Eine Funktion, die über eine Variable aufgerufen wird, wird Methode genannt.

Zufällige Lottozahlen erstellen

Vorgegebene Lottozahlen sind langweilig. Python kann zufällige Zahlen erzeugen, benötigt dazu aber das Modul random.
import random

lotto = []
for i in range(6):
    lotto.append(random.randint(1,49))
Die Funktion randint liefert eine Zufallszahl, die zwischen dem ersten und dem zweiten Parameter liegt, in diesem Fall also zwischen 1 und 49.

Ist ein Element enthalten?

Python erlaubt es, mit dem Befehl in zu prüfen, ob ein Element in einer Liste enthalten ist.
lotto = [ 3, 5, 6, 10, 12, 14 ]
if 12 in lotto:
    print("12 wurde gezogen")
Da der Wert 12 in der Liste lotto auftaucht, wird der print-Aufruf durchgeführt.

Anmerkung: Der Befehl in kann analog bei Strings angewandt werden und stellt fest, ob ein gesuchter String in einem anderen enthalten ist.

satz = "Glaube, Liebe, Hoffnung"
if "Liebe" in satz:
    print("Das ist das wichtigste")

Doppelte ausschließen

Leider kann man nicht vermeiden, dass bei der Erzeugung der Zufallszahlen bisher gezogene Zahlen nicht berücksichtigt werden. Aber man kann prüfen, ob die neu gezogene Zahl bereits in der bisherigen Liste steckt.

Im Beispiel wird der neue Wert so oft neu gezogen, bis er nicht mehr in der bisherigen Liste der Lottozahlen enthalten ist.

import random

lotto = []
for i in range(6):
    neu = random.randint(1,49)
    while neu in lotto:
        neu = random.randint(1,50)
    lotto.append(neu)

Generieren von Listen

Listen können bei der Erzeugung automatisch befüllt werden. Die einfache Form der Vorbesetzung ist die Auflistung der Elemente. Hier die Zahlen von 1 bis 10.
zahlen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Python ist in der Lage, die Elemente zu generieren. Dazu wird wird eine Variable gesetzt und diese durch eine for-Anweisung gefüllt.
zahlen = [n for n in range(1,11)]
Der erste Wert muss keine Variable, sondern kann auch ein Ausdruck sein. In der Grundschule empfahl uns der Lehrer, die Zahlen von 1 bis 20 auswendig zu lernen. Diese Liste lässt sich in Python so erstellen:
quadrat = [n*n for n in range(1,21)]
Links der Ausdruck für die Multiplikation von n mit sich selbst, also das Quadrat. Daneben die for-Schleife, die n mit dem range füttert. Das Ergebnis sieht dann so aus:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]
Die generierten Werte können durch if wieder eingeschränkt werden. Beispielsweise sorgt ein gezieltes if dafür, dass nur die geraden Werte quadriert werden. (ja, das könnte natürlich auch durch range(2,21,2) erreicht werden).
quadrat = [n*n for n in range(1,21) if n % 2 == 0]
Das Ergebnis sieht so aus:
[4, 16, 36, 64, 100, 144, 196, 256, 324, 400]

Listen-Methoden: Sortierte Lottozahlen

Das Sortieren ist gar nicht so einfach, wie man so denkt. Viele Generationen von Programmierern haben sich in dieses Thema verliebt und haben immer effizientere Verfahren entwickeln. Wir können als Schnorrer von diesen Vorleistungen profitieren, indem wir Python die Arbeit überlassen.

Python stellt für Listen die Methode sort zur Verfügung. Diese wird durch einen Punkt getrennt an die zu sortierende Liste angehängt. Die Klammern sind notwendig, auch wenn sort keine Parameter benötigt, damit der Interpreter weiß, dass es eine Funktion ist, die aufgerufen wird und keine Variable.

lotto.sort()
Diese Zeile hängen wir einfach an das Listing an und die Lottozahlen erscheinen sortiert, wie wir es aus der Tagesschau gewohnt sind.

Operationen auf der Liste

Zwei Listen können mit dem Pluszeichen aneinander gehängt werden. Auch der Stern funktioniert bei Listen genauso wie bei Zeichenketten. Sie können damit eine Liste vervielfältigen.
lotto = [ 1, 4, 19, 23, 24, 35 ]
liste = lotto * 2
Die Variable liste enthält zwölf Elemente, nämlich zweimal hintereinander die Lottozahlen.

Die folgende Aufstellung geht davon aus, dass die Variable ls eine Liste ist.

Der Reißverschluss zip

Die Funktion zip() macht aus zwei Listen oder Sequenzen eine Liste von Tupeln, wobei es Paare aus den Elementen der beiden Listen erstellt. Am anschaulichsten ist die Wirkung der Funktion anhand eines Beispiels:
sequenz = "ABCDEF"
liste = [1, 2, 3, 4, 5]
tupelliste = zip(sequenz, liste)
print(tupelliste)
Die Ausführung dieses Programms ergibt folgende Ausgabe.
[('A', 1), ('B', 2), ('C', 3), ('D', 4), ('E', 5)]

Summe einer Liste

Besteht die Liste nur aus Zahlen, kann Sie der Funktion sum() übergeben werden, um die Summe der Zahlen zu ermitteln.

Zweidimensionale Listen

Beginnen wir mit einer Dimension

Eine eindimensionale Liste für neun Felder in waagerechter Richtung: In der rechteckigen Klammer steht ein Pluszeichen.
xdim = 9
feld = ['+'] * xdim
for x in range(xdim):
    print(feld[x], end=' ')
Die Funktion print hängt normalerweise immer einen Zeilenvorschub an das Ende jeder Ausgabe. Allerdings lässt sich das ändern. Hier wurde end mit einem Leerzeichn belegt. So werden alle Zeichen nacheinander durch ein Leerzeichen getrennt ausgegeben.
+ + + + + + + + + 

Felddefinition

Um nun sieben Zeilen je neun Felder zu definieren, wird eine Liste von Listen erstellt.
xdim = 9
ydim = 7
feld = [['+'] * ydim] * xdim
Eine mehrdimensionale Liste ist also quasi eine Liste von Listen.

Alternativ kann das Feld auch mit einer range definiert werden.

xdim = 9
ydim = 7
spielfeld = [['+' for y in range(ydim)] for x in range(xdim)]
xdim = 9 ydim = 7 einmaleins = [[i * j for j in range(m)] for i in range(n)] Die Ausgabe des Feldes geschieht mit zwei ineinander geschachtelten Schleifen.
for y in range(ydim):
    print()
    for x in range(xdim):
        print(feld[x][y], end=' ')
print()
Das Ergebnis:
+ + + + + + + + + 
+ + + + + + + + + 
+ + + + + + + + + 
+ + + + + + + + + 
+ + + + + + + + + 
+ + + + + + + + + 
+ + + + + + + + + 
Mit der Initialisierung können die Felder auch berechnet werden. Das folgend Beispiel erstellt eine 1x1-Tabelle.
einmaleins = [[(i+1) * (j+1) for i in range(ydim)] for j in range(xdim)]
Bei der Ausgabe ersetzt man das end-Zeichen durch einen Tabulator, damit die Spalten schön untereinander sind.
for y in range(ydim):
    print()
    for x in range(xdim):
        print(einmaleins[x][y], end='\t')
print()
Dadurch ergibt sich:
1       2       3       4       5       6       7       8       9       
2       4       6       8       10      12      14      16      18      
3       6       9       12      15      18      21      24      27      
4       8       12      16      20      24      28      32      36      
5       10      15      20      25      30      35      40      45      
6       12      18      24      30      36      42      48      54      
7       14      21      28      35      42      49      56      63     

Heterogene Listenelemente und Referenz auf Listen

Listen fassen mehrere einzelne Werte, die durchaus unterschiedlichen Typs sein können, zu einer Variablen zusammen. Die einzelnen Elemente einer Liste sind im Gegensatz zu einem Tupel nachträglich änderbar.

Stadt = [ "Arnis", "Paris", "Tokio", "New York" ]
for i in Stadt:
    print(i)
Wie schon erwähnt, können Listen auch unterschiedliche Typen aufnehmen.
WasAuchImmer = [ "Arnis", 42, "New York" ]
for i in WasAuchImmer:
    print(i)
print(WasAuchImmer[1]*2)
Tatsächlich liefert die unterste Zeile eine numerische Multiplikation. Solche gemischten Listen könnte man zum Modellieren eines realen Objekts verwenden, beispielsweise eines Autos. Dann könnte jeweils das erste Element die Marke, der zweite das Modell, das dritte die Leistung und so weiter darstellen. Hier eignet sich allerdings eher eine Klasse.

Referenz auf eine Liste

Wenn Sie eine Liste einer anderen Liste zuweisen oder eine Liste als Parameter an eine Funktion übergeben, entsteht keine Kopie, sondern eine Referenz. Es werden also nicht die Daten kopiert, sondern nur ein weiterer Verweis auf die eigentlichen Daten. Das ist natürlich schneller und hat aber zur Konsequenz, dass Änderungen am Duplikat auch beim Original erfolgen, weil es sich ja bei beiden um die Referenz auf die gleichen Daten handelt. Beim Kopieren von Elementen einer Liste ist vorsicht geboten, da meist nicht der Inhalt sondern eine Referenz kopiert wird.
>>> b = [["Hi"]*3]
>>> id(b[0][0])
139944113624048
>>> id(b[0][1])
139944113624048
>>> id(b[0][2])
139944113624048
Die drei Elemente sind dieselben und nicht nur die gleichen. Die Funktion id liefert die Speicheradresse, an der der Variableninhalt steht und zeigt hier auf die gleiche Adresse.

Die Argumentliste sys.argv

Eine besondere Liste ist die Liste der Aufrufparameter. Wird ein Python-Programm über die Kommandozeile aufgerufen, können ihm mehrere Parameter mit auf den Weg gegeben werden. Um auf diese aus dem Programm heraus zugreifen zu können, muss die Bibliothek sys eingebunden werden. Dann kann auf die Liste argv zugegriffen werden.
import sys
for i in sys.argv:
    print(i)
Das erste Element ist immer der Name des Python-Skripts selbst. Es folgen dann die Aufrufparameter.

Übungsaufgaben

Um zu üben, können Sie sich auch das Spiel Codeknacker näher ansehen. Hier werden die Listen für die Geheimzahlen und die Rateversuche genutzt.

Lotto-Nachbarn

Sie haben gelernt, wie Sie zufällige Lottozahlen erstellen können. Nutzen wir dies für eine Statistik! Wir wollen wissen, wie oft es im Schnitt passiert, dass es bei einer Ziehung mindestens ein Nachbarpärchen gibt, also beispielsweise 12 und 13 oder 45 und 44.

Sie sehen schon an den obigen Beispielen, dass es vielleicht einfacher ist, die gezogenen Zahlen vor einer Untersuchung zu sortieren.

Schiffe suchen

Sie können nicht nur Lottozahlen zufällig erstellen. Sie könnten auch zufällige Koordinaten berechnen. Erstellen Sie eine Liste von Tupeln, die Koordinaten im X-Bereich von 0 bis 8 und im Y-Bereich von 0 bis 6 darstellen.

Anschließend erstellen Sie ein Programm, in dem der Anwender Koordinaten rät. Das Programm soll prüfen, ob die geratenen Koordinaten in der Liste der zufälligen Koordinate enthalten ist und dies ausgibt.

In einer weiteren Stufe können Sie eine zweidimensionale Liste von Zeichen wie etwa Pluszeichen erstellen. Nach jedem Rateversuch wird das Feld erneut ausgegeben. War die geratene Kooridinate ein Treffer, ersetzen Sie zuvor an der entsprechenden Stelle in der Matrix das Pluszeichen durch ein X. Wenn es keinen Treffer gab, setzen Sie einen Punkt.

Wechselgeld-Automat

Ein Warenautomat soll Wechselgeld herausgeben können. Der Automat gibt einen Preis vor (fest oder zufällig). Der Anwender gibt Münzen ein und erhält bei Überzahlung den Rest zurück, sofern noch Münzen im Automat sind.

Sie benötgen eine Liste für den Wert der Geldstücke in Cent. Die Liste hat also 200, 100, 50, 20, 10, 5, 2 und 1 Cent als Inhalt.

Eine genauso große Liste enthält die Anzahl der Münzen, die in jedem dieser Schächte im Automat liegen. Zahlt der Anwender ein, werden seine Münzen in dieser Liste gesammelt. Anschließend versucht der Automat, den Restbetrag zurückzugeben. Dabei wird er klugerweise versuchen, möglichst große Münzen herauszugeben.

Reicht der Münzvorrat nicht aus, wird der Automat nur soviel Wechselgeld herausrücken, wie ihm zur Verfügung steht.

Video