Sequentielle Datentypen

Einführung

Mit dem Datentyp String haben wir bereits ein Beispiel für einen sequentiellen Datentyp kennengelernt. Sequentiell bedeutet, dass der Inhalt durchnummeriert ist, was eben mit den Zeichen eines Strings der Fall ist. Neben diesem gibt es aber noch weitere sequentielle Datentypen, die wir nun betrachten wollen.

Listen

Während ein String nur Schriftzeichen enthalten kann, können in einer Liste beliebige Daten abgelegt werden. In unserem ersten Beispiel legen wir ein paar Zahlen ab:

erste_liste = [2, 3, 5, 7, 11]
print(erste_liste) # Ausgabe: [2, 3, 5, 7, 11] 

print(erste_liste[0]) # Ausgabe: 2
print(erste_liste[4]) # Ausgabe: 11
print(len(erste_liste)) # Ausgabe: 5

Wie wir sehen, wird eine Liste durch eckige Klammern markiert. Die einzelnen Elemente der Liste werden jeweils durch ein Komma getrennt. Eine Liste können wir unmittelbar mit print wieder ausgeben lassen.

Möchten wir auf ein einzelnen Element, können wir dies genau wie bei Strings, indem wir den Namen unserer Liste gefolgt von der Nummer des Elements in eckigen Klammern schreiben. Auch hier beginnt die Nummerierung bei Null. Mit len erhalten wir die Länge der Liste.

Im Gegensatz zu Strings erlauben es Listen, einzelne Elemente zu ersetzen:

erste_liste = [2, 3, 5, 7, 11]
erste_liste[4] = 9
print(erste_liste) # Ausgabe: [2, 3, 5, 7, 9]

Wir werden uns dies später noch einmal genauer ansehen, da es hier ein paar kniffelige Details gibt, die auf den ersten Blick vielleicht nicht auffallen.

Die gespeicherten Daten dürfen von verschiedenen Typen sein. Hier legen wir gleich Werte von vier verschiedenen Typen ab:

zweite_liste = [1.5, 'drei', 100, True]
print(zweite_liste) # Ausgabe: [1.5, 'drei', 100, True]

Ein Liste darf sogar wieder Listen enthalten:

erste_liste = [2, 3, 5, 7, 11]
erste_liste[4] = 9
zweite_liste = [1.5, 'drei', 100, True]

dritte_liste = [erste_liste, zweite_liste, [1, 2, 3], 99.9]

print(dritte_liste) # Ausgabe: [[2, 3, 5, 7, 9], [1.5, 'drei', 100, True], [1, 2, 3], 99.9]
print(len(dritte_liste)) # Ausgabe: 4

print(dritte_liste[0]) # Ausgabe: [2, 3, 5, 7, 9]
print(dritte_liste[0][0]) # Ausgabe: 2

Obwohl es auf den ersten Blick so scheint als enthalte dritte_liste mehr als vier Elemente, ist die Länge tatsächlich nur Vier, da die enthaltenen Listen als jeweils ein Objekt zählen. Mit dritte_liste[0] greifen wir auf die erste enthaltene Liste zu. Mit der zweiten eckigen Klammer können wir dann auf die verschiedenen Elemente dieser enthaltenen Liste zugreifen.

Tupel

Tupel sind Listen sehr ähnlich. Der entscheidende Unterschied ist, dass ein Tupel unveränderlich ist. Das bedeutet, dass die gespeicherten Werte

im Nachhinein nicht mehr verändert werden können. Eine Liste legt man im Gegensatz zu Listen mit runden Klammern an. Der Zugriff auf die Objekte funktioniert aber wieder über eckige Klammern:

erstes_tupel = (2, 3, 5, 7, 11)
print(erstes_tupel) # Ausgabe: (2, 3, 5, 7, 11) 

print(erstes_tupel[0]) # Ausgabe: 2
print(erstes_tupel[4]) # Ausgabe: 11
print(len(erstes_tupel)) # Ausgabe: 5

zweites_tupel = (1.5, 'drei', 100, True)
print(zweites_tupel) # Ausgabe: (1.5, 'drei', 100, True)

drittes_tupel = (erstes_tupel, zweites_tupel, (1, 2, 3), 99.9)
print(drittes_tupel) # Ausgabe: ((2, 3, 5, 7, 9), (1.5, 'drei', 100, True), (1, 2, 3), 99.9)
print(len(drittes_tupel)) # Ausgabe: 4

print(drittes_tupel[0]) # Ausgabe: (2, 3, 5, 7, 9)
print(drittes_tupel[0][0]) # Ausgabe: 2

erstes_tupel[4] = 9
print(erstes_tupel) # TypeError: 'tuple' object does not support item assignment

Mengen

Erzeugen von Mengen

Mengen in Python haben die Eigenschaften, die Mengen auch im mathematischen Sinn haben. D. h., ein Objekt kann höchstens einmal in einer Menge vorhanden sein und die enthaltenen Objekte besitzen keine festgelegte Reihenfolge.

Eine Menge wird anders als Listen oder Tupel nicht unmittelbar definiert, sondern mit der Funktion seterzeugt:

erste_menge = set(["rot", "grün", "blau"])
zweite_menge = set(("schwarz", "rot", "gold"))
dritte_menge = set(("weiß", "grau", "schwarz"))

Die Funktion set erwartet als Parameter eine Liste, ein Tupel oder ein sonstiges Objekt, dessen Elemente durchlaufen werden können. In diesem Beispiel wurde die erste Menge durch Angabe einer Liste und die folgenden jeweils durch Angabe eines Tupels erstellt.

Einfache Funktionen

Die Anzahl der Elemente einer Liste erfahren wir mit len. Mit in prüfen wir, ob ein Objekt in einer Menge enthalten ist:

erste_menge = set(["rot", "grün", "blau"])
zweite_menge = set(("schwarz", "rot", "gold"))
dritte_menge = set(("weiß", "grau", "schwarz"))

print(len(erste_menge)) # Ausgabe: 3
print("rot" in erste_menge) # Ausgabe: True
print("rot" in zweite_menge) # Ausgabe: True
print("rot" in dritte_menge) # Ausgabe: False

Weitere Funktionen

Daneben sehen wir uns noch die folgenden vier einfachen Funktionen an:

FunktionZweck
copy()Kopieren einer Menge
add()Hinzufügen eines Elements
discard()Entfernen eines Elements
clear()Leeren einer Menge

Wie gewohnt ein Beispiel:

erste_menge = set(["rot", "grün", "blau"])

neue_menge = erste_menge.copy()
print (neue_menge) # Ausgabe: {'rot', 'blau', 'grün'}

neue_menge.add("gelb")
print (neue_menge) # Ausgabe: {'rot', 'blau', 'gelb', 'grün'}

neue_menge.discard("blau")
print (neue_menge) # Ausgabe: {'rot', 'gelb', 'grün'}

neue_menge.clear()
print (neue_menge) # Ausgabe: set()
print (erste_menge) # Ausgabe: {'rot', 'blau', 'grün'}

Wie wir an der letzten Ausgabe sehen, hat eine Veränderung an neue_menge keinen Einfluss auf erste_menge, weil wir neue_menge mit der Methode copy() erstellt haben.

Vergleichen von Mengen

Zum Vergleich zweier Mengen stehen uns vier Vergleichsoperatoren zur Verfügung:

OperatorBedeutung
<Teilmenge
<=echte Teilmenge
>Obermenge
>=echte Obermenge

Betrachten wir ein Beispiel:

erste_menge = set(["rot", "grün", "blau"])
zweite_menge = set(("schwarz", "rot", "gold"))

print(set(["rot", "grün"]) < erste_menge ) # Ausgabe: True
print(set(["rot", "grün"]) < zweite_menge ) # Ausgabe: False

print(set(["rot", "grün"]) <= erste_menge ) # Ausgabe: True
print(set(["rot", "grün", "blau"]) < erste_menge ) # Ausgabe: False

Mengenoperationen

Die aus der Mathematik bekannten Mengenoperationen können wir wir folgt verwenden:

OperatorBedeutung
|Vereinigungsmenge
&Schnittmenge
-Differenzmenge
^symmetrische Differenzmenge

Auch dazu betrachten wir ein Beispiel:

erste_menge = set(["rot", "grün", "blau"])
zweite_menge = set(("schwarz", "rot", "gold"))

print (erste_menge | zweite_menge) # Ausgabe: {'gold', 'rot', 'grün', 'blau', 'schwarz'}
print (erste_menge & zweite_menge) # Ausgabe: {'rot'}
print (erste_menge - zweite_menge) # Ausgabe: {'grün', 'blau'}
print (erste_menge ^ zweite_menge) # Ausgabe: {'blau', 'grün', 'gold', 'schwarz'}

Frozenset

Wir wir gesehen haben, lassen sich Mengen im vielfältiger Weise manipulieren. Möchte man dies unterbinden, muss man eine sogenanntes Frozenset verwenden:

erste_menge = set(["rot", "grün", "blau"])

zweite_menge = frozenset(erste_menge)
dritte_menge = frozenset(("blau", "gelb"))

print (zweite_menge) # Ausgabe: frozenset({'grün', 'rot', 'blau'})
print (dritte_menge) # Ausgabe: frozenset({'blau', 'gelb'})

zweite_menge.add("lila") # AttributeError: 'frozenset' object has no attribute 'add'