13: Listen (Arrays)

Eine Liste ist eine Reihe von mehreren Variablen, die unter einem einzelnen Namen zusammengefasst werden. Anstatt ein Programm mit vielen Variablen x0, x1, x2 zu schreiben, kannst du eine einzelne Variable x definieren und ihre einzelnen Mitglieder x[0], x[1], x[2], etc aufrufen. Was noch wichtiger ist: du kannst andere Ausdrücke und Variablen in die eckigen Klammern setzen, wie x[i] und x[i+1]. Dies erlaubt es uns, mit beliebig großen Datensätzen umzugehen, indem wir nur ein einziges kleines Stück Code benutzen.

Ein Weg, eine Liste zu erzeugen ist es, mehrere Variablen beizufügen, die durch Kommas in eckigen Klammern getrennt werden:

myList = ["the first value in the list", 1999, 4.5]
Dies erzeugt eine Liste, die den Namen myList und eine Länge von 3 hat. Jedes Element der Liste bekommt eine Nummer zugeordnet, die man seinen Index nennt: das erste Element hat den Index 0, das nächste hat den Index 1 und so weiter. Die individuellen Variablen, aus denen die Liste besteht, haben die Namen

«listName»[«indexNumber»]

Also ist in diesem Beispiel myList[0] eine Variable, deren Wert folgende Zeichenkette ist: "the first value in the list" und print(myList[2]) ergibt 4.5. Du kannst außerdem die Werte der einzelnen Elemente der Liste ändern und komplette Listen ausgeben:

Beispiel
Eine Liste ändern und ausgeben

Wie du sehen kannst, verhält sich numbers[0], als ob es selbst eine Variable sei und verändert werden könnte.

Versuche als nächstes den finalen Zustand des folgenden visualisierten Beispiels vorauszusagen,
vergleiche ihn dann, indem zu den Code laufen lässt.

Multiple-Choice-Übung: Meta-Kram
Was ist die Ausgabe des folgenden Codefragments?

stuff = [2, 25, 80, 12]
stuff[stuff[0]] = stuff[3]
print(stuff)
Korrekt! Sieh dir das Zuordnungsstatement an (2te Zeile). Der Wert von stuff[3] auf der rechten Seite ist 12. Auf der linken Seite ist stuff[0] gleich 2, also verweist stuff[stuff[0]] auf die Variable stuff[2]. Der Wert dieser Variable wird aufgewertet (von 80) auf 12.

Was Python eine Liste nennt, würde in den meisten anderen Programmiersprachen als Array bezeichnet werden. Python hat außerdem etwas anderes und wesentlich fortgeschritteneres, das es als Array bezeichnet.

Ein üblicher Fehler

Wenn du versuchst, Python nach einem Index zu fragen, der nicht existiert, bekommst du eine Fehlermeldung:

Beispiel
Außerhalb-der-Reichweite-Fehler.

Im obigen Beispiel, weil myList die Länge 4 hat und der erste Index 0 ist, ist der maximal zulässige Index 3. Wenn du nun nach einem Index von 4, 5 oder höher fragst, bekommst du diese Art von Fehler.

Übliche hilfreiche Operationen

Die Länge einer Liste: len(«list»)

Um die Anzahl von Elementen in einer Liste zu bestimmen, rufe die Funktion len() auf dieser Liste auf. Schau dir an, wie range im folgenden Beispiel verwendet wird.

Beispiel
Die Länge einer Liste bekommen und sie verwenden, um durch die Liste zu schleifen.

Es ist üblich, len zu benutzen, um Code zu schreiben, der mit Listen jeglicher Länge funktioniert, wie im Beispiel oben und der nächsten Übung.

Programmierübung: Monkey in the Middle
Schreibe eine Funktion middle(L), die eine Liste L als ihr Argument nimmt und das Element in der mittleren Position von L zurückgibt. (Damit die Mitte gut definiert ist, solltest du annehmen, dass die Länge von L ungerade ist.) Zum Beispiel sollte, wenn du middle([8, 0, 100, 12, 1]) aufrufst, 100 zurückgegeben werden.
Gib Testbefehle wie print(meinefunktion("Test-Argument")) unten ein.

Sind Listen wie Zeichenketten?

Mittlerweile solltest du gemerkt haben, dass die Operationen, die auf Listen ausgeführt werden, ziemlich ähnlich sind, wie Zeichenketten bzw. Strings: bei beiden ist die Länge anhand der len() Funktion ersichtlich und beide verwenden X[«index»], um einzelne Elemente auszuwählen. Listen und Strings sind tatsächlich verwandt: sie werden von Python beide als "sequence types" bezeichnet. Der eine große Unterschied ist, dass einzelne Zeichen in Zeichenketten nicht verändert werden können.

Beispiel
Fehler, hervorgerufen durch den Versuch einem Zeichen einen Wert in einem String zuzuordnen.

Aus diesem Grund nennt man Listen veränderlich und Zeichenketten unveränderlich; du wirst ein paar weitere Informationen darüber sehen in Lektion 17.

Verkettung und Erzeugung

Aus der Lektion über den Typ str kannst du dich vielleicht noch daran erinnern, dass es möglich ist, + zu verwenden, um zwei Strings miteinander zu verschmelzen (verketten). Das Gleiche kannst du mit Listen machen:

Beispiel
Listen kombinieren mit +.

Ganz ähnlich kannst du das Multiplikationszeichen * benutzen, um eine Liste durch Wiederholungen zu verlängern. Dies ist hilfreich, um eine neue Liste zu erzeugen, die so lang ist, wie du sie haben möchtest.

Beispiel
* verwenden.

Um die nächste Übung zu lösen, verwende einen der Operatoren, die wir gerade eingeführt haben, und eine for Schleife.

Programmierübung: It's Natural
Schreibe eine Funktion naturalNumbers, die eine positive Ganzzahl n als Eingabe nimmt, und eine Liste [1, 2, ...] zurückgibt, die aus den ersten n natürlichen Zahlen besteht.
Gib Testbefehle wie print(meinefunktion("Test-Argument")) unten ein.

Am Ende: Negative Indizes

Um an das letzte Element einer Liste zu kommen, verwende

«listName»[-1]

Allgemeiner gesprochen, gibt L[-k] das k-te Element vom Ende der Liste aus. Python behandelt dies intern, indem es das Element zu L[len(L)-k] übersetzt. Diese Abkürzung funktioniert auch für Zeichenketten!

Programmierübung: Palindrome
Ein Palindrom ist ein Wort, das von vorne genauso buchstabiert wie rückwärts. So ist zum Beispiel das englische Wort

racecar

ein Palindrom: der erste und letzte Buchstabe sind der gleiche (r), der zweite und der vorletzte Buchstabe sind der gleiche (a), etc. Schreibe eine Funktion isPalindrome(S), die einen String s als Input nimmt und True ausgibt, wenn die Zeichenkette ein Palindrom ist und False, wenn sie es nicht ist.

Gib Testbefehle wie print(meinefunktion("Test-Argument")) unten ein.

max und sum

Die Funktion max, die wir bereits gesehen haben, kann auch bei einer Liste von Zahlen verwendet werden: sie gibt die größte Zahl in der Liste aus. Für Listen mit Zahlen gibt es auch die Funktion sum(L), welche die Summe der Zahlen in der Liste L liefert. Übrigens: Während man max auch für Listen mit Elementen anderer Typen (wie z.B. characters) verwenden kann, funktioniert sum nur für Zahlen.

Beispiel

Programmierübung: Product
Definiere eine Funktion prod(L), die das Produkt der Elemente in einer Liste L ausgibt.
Gib Testbefehle wie print(meinefunktion("Test-Argument")) unten ein.

Durch Listen schleifen

Es ist sehr üblich (wie in der vorherigen Übung), durch jeden Wert einer Liste zu schleifen. Python erlaubt es, eine Abkürzung zu benutzen, um diese Art von Operation durchzuführen, die man üblicherweise eine "für alles" Schleife oder eine "für jedes" Schleife nennt. Um genau zu sein: wenn L eine Liste ist, macht dieser Code

for x in L:
  «loop body block»
das folgende: zuerst wird x auf den ersten Wert in L eingestellt und der Körper wird ausgeführt; dann wird x auf den zweiten Wert in L eingestellt und der Körper ausgeführt; dies wird für alle Unterpunkte von L genau so durchgeführt.

Hier ist ein visualisiertes Beispiel, welches die Elemente einer Liste ausgibt:

Programmierübung: for in
Definiere die Funktion prod(L) wie vorher, aber diesmal verwende die neue Art von Schleife.
Gib Testbefehle wie print(meinefunktion("Test-Argument")) unten ein.

"Für alle" Schleifen funktionieren auch für Zeichenketten: versuche for char in "hello".

Gut gemacht! Du kannst zur nächsten Lektion weiter, oder ein paar Bonusübungen weiter unten ausprobieren.


Kurzübung: Mystery Function
Was ist der Wert von x, der mystery(x) dazu bringen wird, unendlich zu laufen?

def mystery(x):
  a = [0, 4, 0, 3, 2]
  while x > 0:
    x = a[x]
  return "Done"
Richtig!

Sortierübung: à la Mode
Der mode einer Liste ist das Element, das am häufigsten in der Liste vorkommt (bzw. maximal häufig vorkommt). Entwirre das folgende Programm so, dass mode(L) korrekt den mode findet, unter der Annahme, dass L eine Liste von Zahlen von 0 bis 9 ist. (In unseren Tests wird es keine zwei Zahlen geben, die gleichauf liegen in Bezug auf die maximale Häufigkeit.).
  • return i
  • frequency = [0]*10
  • frequency[i] = frequency[i] + 1
  • for i in range(0, 10):
  • def mode(L):
  • for i in L:
  • if frequency[i]==max(frequency):