Datenstrukturen

Wenn die Menge an Daten zu groß wird, um sie in einfache Variablen zu speichern, greift man auf andere Datenstrukturen zurück. Hier di wichtigsten.

einfache Listen mehrdimensionale Listen Tupel und Dictionaries

Diese Datenstrukturen bieten wiederum die Möglichkeit…

…sie mit Wiederholungen zubesetzen, durchlaufen und auszugeben.

…sie mit eigens dafür bereitgestellten Methoden zu verändern.

..auf einzelne Elemente zuzugreifen.

1. Listen (einfach)

Wir haben im Kapitel „Wiederholungsstrukturen“ schon ein Feld benutzt, ohne es zu merken: das Ding in den eckigen Klammern

fruits = ["apple", "banana", "cherry"]

Beispiel: das Tic Tac Toe-Feld als Liste .

Ein TicTacToe-Feld kann man sich ja auch als Liste von Zahlen vorstellen:

Durchnummeriertes Feld bei TicTacToe

in Python würde dieses Feld so aussehen:

spielfeld = [" ",  
               "1","2","3", 
                "4","5","6",
                "7","8","9"]

…oder ohne Zeilenumbrüche geschrieben:

spielfeld = [" ","1","2","3","4","5","6","7","8","9"]

Jedes Element eines Feldes hat eine Indexnummer, das erste hat die Indexnummer 0. Deshalb können wir unser Spielfeld so ausdrucken:

spielfeld = [" ","1","2","3","4","5","6","7","8","9"] 
# Spielfeld ausgeben  
print (spielfeld[1] + "|" + spielfeld[2] + "|" + spielfeld[3] )  
print (spielfeld[4] + "|" + spielfeld[5] + "|" + spielfeld[6] )  
print (spielfeld[7] + "|" + spielfeld[8] + "|" + spielfeld[9] )

So, un jetzt können wir statt der Zahlen einen aktuellen Spielstand in das Feld eingeben (bestehend aus X, O und noch unbesetzten Feldern):

spielfeld = [" ","X"," ","X"," ","O"," ","X"," ","O"] 
# Spielfeld ausgeben 
print (spielfeld[1] + "|" + spielfeld[2] + "|" + spielfeld[3] ) 
print (spielfeld[4] + "|" + spielfeld[5] + "|" + spielfeld[6] ) 
print (spielfeld[7] + "|" + spielfeld[8] + "|" + spielfeld[9] )

Ihr seht: die Indexzahlen funtionieren weiterhin; das zweite Element der Liste ist ein „X“…

Stellt Euch vor, wir haben ein größeres Spielfeld (z. B. für Vier gewinnt)

—> Das in einem Feld abzuspeichern wir schnell unübersichtlich…

Zum Weiterüben:

Das Kapitel zu Listen in CSC

Das Kapitel zu Listen in Snackify

2. Listen (mehrdimensional)

Für Vier gewinnt wäre das ein Feld von 10 x 10, und es gibt folglich auch zwei Indices /wie x und y in einem Koordinatensystem.

Die allgemeine Schreibweise Feld[0,0] spricht das Feld in der linken, oberen Ecke an, die Schreibweise Feld[3,3] das Feld in der Mitte usw. Warum 0 und warum 3 und nicht 4? Ganz einfach, weil bei fast allen Programmiersprachen die Nummerierung bei 0 beginnt und nicht bei 1.

Übertragen auf unser TicTacToe-Beispiel würde das zweidimensionale Feld so aussehen:

feld = [[1, 2, 3], [ 4, 5, 6], [7, 8, 9]]

beziehungsweise

feld = [["X", " ", "X"], ["O","O", " "], [" ", "X", "O"]]

Jetzt sind also die Spilefelder in Zeilen gruppiert. Um ein einzelnes Feld anzusprechen, brauchen wir zwei Indexziffern (also sprich „Zeile“ und „Spalte“:

feld = [["X", " ", "X"], ["O","O", " "], [" ", "X", "O"]]
print (feld[2][2])

Kopiert Euch den Code und führt ihn aus. Welchse Feld wird ausgegeben?

Hier eine bildhafte Repräsentation:

Um das neue Spielfeld komplett auszugeben, brauch Ihr eine geschachtelte Schleife:

feld = [["X", " ", "X"], ["O","O", " "], [" ", "X", "O"]]
for zeile in feld:
    for spalte in zeile:
        print(spalte,end = " ")
    print()


Zum Weiterüben:

Das Kapitel zu mehrdimensionalen Listen in Snackify

3. Sonderfälle: Tupel und Dictionaries

Zunächt zum Tupel: Der einzige Unterschied zur Liste ist der, dass die Werte im Tupel unveränderbar sind. Tupel werden statt in eckigen in runden Klammern notiert. Mit Komma getrennte Werte werden vei einer Variablenzuweisung als Tupel umgesetzt:

  >>> zz = 1,4
  >>> print (zz)
  (1, 4) 

Oft will man in einer größeren Menge Daten eine Zuordnung schaffen, nach dem Motto: „Zu diesem Schlüssel (key) gehört dieser Wert / diese Werte (values). In Python gibt’s dafür den Datentyp Dictionary.

Bleiben wir doch bei der ursprünglichen Bedeutung und verstehen das Dictionary als Wörterbuch. Jeder englischen Vokabel ist hier zunächst eine deutsche Vokabel zugeordnet. Im Dictionary werden diese Zuordnungen als Paare gespeichert. Hier ein Dictionary mit zwei „Einträgen“:

>>> woerter = {"house" : "Haus", "cat":"Katze"} 

In dieser Datenstruktur lässt sich nun die Zuordnung nutzen, um direkt den zugeordneten Wert für einen Schlüssel zu bekommen:

>>> print(woerter["house"])
Haus

Will man auf einen Schlüssel zugreifen, der nicht existiert, bekommt man eine Fehlermeldung. Um diese zu umgehen, kann man aber abfragen, ob der Schlüssel existiert:

>>> if "car" in woerter: print woerter["car"]

>>> if "cat" in woerter: print woerter["cat"]

Katze

Ihr seht, in beiden Fälle müssen wir nicht die Datenstruktur mit einer Wiedeholungsschleife durchlaufen, um uns die Ergebnisse zu holen!

Zum Weiterüben:

Das Kapitel zu Dictionaries in Snackify