Tupel | Python-Kurs | Dictionary |
- Eine Liste definieren und darauf zugreifen
- Arrays ohne Literal anlegen
- Ist ein Element enthalten?
- Listen-Methoden: Sortierte Lottozahlen
- Operationen auf der Liste
- Zweidimensionale Listen
- Heterogene Listenelemente und Referenz auf Listen
- Die Argumentliste sys.argv
- Beispielprojekt: Codeknacker-Spiel
- Übungsaufgaben
- Video
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] = 3Ein 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]*6Auch 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.
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 * 2Die 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.
- ls.append(element):
Mit append werden Elemente hinten an die Liste angehängt.
Lottozahlen.append(9)
- ls.insert(pos, element):
Fügt ein Element an einer bestimmten Position ein.
Lottozahlen.insert(1, 21)
- del(ls[pos]):
Ein Element einer Liste kann mit der Funktion del entfernt werden.
Als Parameter wird die Position in der Liste angegeben.
Alle nachfolgenden Elemente rücken dann um eins auf.
del Lottozahlen[1]
- ls.remove(element): Wie del löscht auch remove ein Element. Während aber bei del
die Position angegeben wird, wird remove ein Element übergeben, das remove
in der Liste sucht. Ist das gesuchte Element nicht in der Liste, führt die
Funktion zu einer Exception.
Lottozahlen.remove[9]
- ls.count: Die Funktion count erhält ebenfalls ein Element als Parameter
und zählt, wie oft das Element in der Liste erscheint.
Lottozahlen.count(11)
- ls.index(element): Die Funktion liefert die Position des ersten Auftretens von element in der Liste.
- ls.extend(liste): Erweitert die Liste und eine weitere Liste.
- pop(pos): Liefert das Element an der Position pos und entfernt es gleichzeitig aus der Liste. Wird kein Parameter angegeben, wird das letzte Element verwendet.
- ls.reverse(): Die Funktion dreht die Liste um.
- ls.sort():
Die Funktion sortiert die Liste.
Sie können als Parameter eine Vergleichsfunktion übergeben.
Lottozahlen.sort()
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] * xdimEine 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]) 139944113624048Die 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