Tutorial:Programmieren mit Python/Datenstrukturen

Aus KGS-Wiki

Aus der visuellen Programmierung kennen wir die Liste als Datenstruktur, um eine variable Anzahl semantisch zusammengehöriger Informationen zu speichern. Auch in Python können wir mit Listen arbeiten, darüber hinaus stehen uns aber noch weitere Datenstrukturen zur Verfügung: Tupel, Mengen und Wörterbücher.

Die grundlegenden Eigenschaften und Unterschiede zwischen den anderen drei Datenstrukturen sollen hier kurz zusammengefasst werden:

Eigenschaft/​Funktionalität Liste Tupel Menge
Anzahl Elemente variabel fest variabel
Elemente dürfen mehrmals vorkommen ja ja nein
Elemente dürfen verändert werden ja nein nein
Reihenfolge der Elemente fest fest beliebig
Definition a = [42, True, 'Hello'] b = (42, True, 'Hello') c = {42, True, 'Hello'}
Element an Position abrufen a[x] b[x] nicht möglich, da Mengen keine Reihenfolge haben
Größe bestimmen len(a) len(b) len(c)
Element hinzufügen a.append(3.141) nicht möglich, da die Länge von Tupeln beschränkt ist c.add(3.141), hat keine Auswirkung, wenn das Element schon vorher in der Menge enthalten war.
Prüfen, ob enthalten ist x in a x in b x in c

Slicing

Python gestattet nicht nur den Zugriff auf einzelne Elemente einer Liste, sondern ermöglicht auch unkompliziert das Erstellen von Teillisten, das so genannte Slicing. Dafür können bis zu drei Indizes angegeben werden:

  1. der Beginn der Teilliste
  2. das erste Element, das nicht mehr Teil der Teilliste sein soll
  3. der Abstand zwischen den Elementen der Teilliste

Notiert werden diese Indizes durch Doppelpunkte getrennt in eckigen Klammern hinter dem Namen der Liste, also Liste[Start:Ende:Schritt].

Alle drei Indizes können leer gelassen werden. In diesem Fall werden folgende Standardwerte eingesetzt:

  1. 0 für den Beginn
  2. len(Liste) für das Ende
  3. 1 für die Schrittweite
>>> a = [1,2,3,4,5,6,7,8,9,10]
>>> a[3:7]
[4, 5, 6, 7]
>>> a[3:]
[4, 5, 6, 7, 8, 9, 10]
>>> a[:5]
[1, 2, 3, 4, 5]
>>> a[1:7:2]
[2, 4, 6]
>>> a[1::2]
[2, 4, 6, 8, 10]
>>> a[:7:2]
[1, 3, 5, 7]
>>> a[::]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Für alle Indizes können auch negative Werte eingesetzt werden. Dies bedeutet, dass vom Ende der Liste an gezählt wird statt vom Anfang. Ein Start- oder End-Index von -1 bezieht sich also auf das letzte Element der Liste. Wenn der Endwert kleiner ist als der Startwert, kann eine negative Schrittweite angegeben, um die Elemente rückwärts aufzuzählen

>>> a[2:-2]
[3, 4, 5, 6, 7, 8]
>>> a[-9:7]
[2, 3, 4, 5, 6, 7]
>>> a[-5:-1]
[6, 7, 8, 9]
>>> a[-5:-1:2]
[6, 8]
>>> a[-1:-7:-2]
[10, 8, 6]
>>> a[7:3]
[]
>>> a[7:3:-1]
[8, 7, 6, 5]
>>> a[::-2]
[10, 8, 6, 4, 2]

Strings als Sonderfall von Listen

Strings werden in vieler Hinsicht wie Listen behandelt und unterstützen einige Listenoperationen, insbesondere Slicing:

>>> b = 'Panamakanal'
>>> b[5]
'a'
>>> b[1::2]
'aaaaa'
>>> b[::-1]
'lanakamanaP'
>>> 'e' in b
False
>>> 'n' in b
True
>>> len(b)
11

Anders als Listen können Strings aber nicht verändert werden:

>>> a[2] = 0
>>> a
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10]
>>> a.append(11)
>>> a
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10, 11]
>>> b[1] = 'e'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> b.append('?')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'append'

Exkurs: Wörterbücher

Wörterbücher, englisch dictionaries, sind eine Schlüssel-Wert-Datenstruktur, d.h. die Daten werden in Paaren von einem Schlüssel und einem dazugehörigen Wert abgelegt. Mithilfe des Schlüssels kann der Wert dann effizient gefunden werden.

>>> englischvokabeln = {'cat': 'Katze', 'dog': 'Hund', 'mouse': 'Maus'}
>>> englischvokabeln
{'cat': 'Katze', 'dog': 'Hund', 'mouse': 'Maus'}

Es gibt zwei Möglichkeiten, einen Wert mithilfe eines Schlüssels aus einem Wörterbuch abzufragen:

Nicht alle Programmiersprachen erzeugen eine Fehlermeldung, wenn man einen nicht vorhandenen Schlüssel abfragt. In JavaScript ist das kein Problem.
  1. Man setzt den Schlüssel wie einen Listen-Index in eckige Klammern; dies führt zu einer Fehlermeldung, wenn man einen nicht vorhandenen Schlüssel abfragt:
>>> englischvokabeln['cat']
'Katze'
>>> englischvokabeln['dog']
'Hund'
>>> englischvokabeln['duck']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'duck'
  1. Man verwendet die get-Methode; die Abfrage eines nicht vorhandenen Schlüssels sorgt dann dafür, dass ein Standardwert zurückgegeben wird, den man optional ebenfalls angeben kann:
>>> englischvokabeln.get('dog')
'Hund'
>>> englischvokabeln.get('duck')
>>> englischvokabeln.get('dog', 'Das weiß ich nicht')
'Hund'
>>> englischvokabeln.get('duck', 'Das weiß ich nicht')
'Das weiß ich nicht'

Mit den Methoden keys, values und items können die Schlüssel, Werte und Schlüssel-Wert-Paare des Wörterbuches in Form von Listen ausgewertet werden:

>>> englischvokabeln.keys()
dict_keys(['cat', 'dog', 'mouse'])
>>> englischvokabeln.values()
dict_values(['Katze', 'Hund', 'Maus'])
>>> englischvokabeln.items()
dict_items([('cat', 'Katze'), ('dog', 'Hund'), ('mouse', 'Maus')])