Alles über Tuples in Python

Tuples gehören in Python zu den wichtigsten Datenstrukturen und finden überall Anwendung, von kleinen bis zu sehr komplexen Projekten. Sie dienen dazu, mehrere Werte in einer einzigen Variablen zu gruppieren, ähnlich wie Listen. In diesem Artikel werden wir uns eingehend mit der Syntax, den grundlegenden Funktionen und Operationen sowie den Einsatzmöglichkeiten von Tupeln beschäftigen.

In Python ist ein Tupel eine unveränderliche (immutable) Sammlung von Werten, die unterschiedliche Datentypen haben können, wie z. B. Zahlen, Zeichenfolgen (String) oder Booleans. Dadurch eignen sie sich zum Speichern von Gruppen verwandter Daten, die nach ihrer Erstellung nicht mehr geändert werden müssen.

Tupel sind generell speichereffizienter als Listen, da sie den Speicher nicht "über"-allokieren (um das hinzufügen neuer Elemente zu ermöglichen) und auch Konstantenfaltung unterstützen ("Constant folding" ist eine Compiler-Optimierung). Natürlich ist es aber trotzdem sinnvoll, die Performance für den spezifischen Anwendungsfall zu testen.

Grundsätzliche Merkmale der Tuples:

Ein Tuple erstellen

Der tuple()-Konstruktor

Der tuple()-Konstruktor ist eine built-in Python-Funktion (kein import notwending), mit der man Tuples instanzieren kann. Dabei wird ein iterable Objekt (also zB. eine Liste oder ein anders Tupel) als Argument übergeben:

# Ein Tuple aus einer Liste erstellen
demo_tuple = tuple(["JBerries", "is", "awesome"])
print(demo_tuple)
# Ausgabe: ('JBerries', 'is', 'awesome')

# Ein Tuple direkt mit dem Konstruktor erstellen
# Wichtig!: doppelte runde Klammern - sonst wird das Argument nicht als "Iterable" erkannt (TypeError)
demo_tuple = tuple(("JBerries", "is", "awesome"))
print(demo_tuple)
# Ausgabe: ('JBerries', 'is', 'awesome')

Da das Argument für die tuple()-Funktion optinal ist, können wir auch leere Tuples erstellen:

empty_tuple = tuple()
print(empty_tuple)
# Ausgabe: ()

Instanzierung über runde Klammern

Der syntaktisch einfachste Weg, ein Tuple zu instanziieren, ist über die runden Klammern mit komma-getrennt festgelegten Elementen:

test_tuple = ("JBerries", "is", "awesome")
print(test_tuple)

Wenn man ein Tuple mit nur einem Element benötigt, dann muss man ein zusätzliches Komma nach dem Element hinzufügen. Ohne das Komma interpretiert Python den Wert nicht als eine Tupel:

ein_tuple = ("Foo",)
print(type(ein_tuple))
# Ausgabe: <class 'tuple'>

# Von Python als String interpretiert:
kein_tuple = ("Foo")
print(type(kein_tuple))
# Ausgabe: <class 'str'>

Die wichtigsten Tuples-Funktionen

Um die Anzahl der Elemente in einem Tuple zu ermitteln, wird die len()-Funktion verwendet:

test_tuple = ("JBerries", "is", "awesome")
print(len(test_tuple))
# Ausgabe: 3

Die count()-Methode gibt die Anzahl der Vorkommen eines bestimmten Elements innerhalb eines Tuples zurück.

test_tuple = ("JBerries", "JBerries", "JBerries")
print(test_tuple.count("JBerries"))
# Ausgabe: 3

Die index()-Methode gibt den Index des ersten Vorkommens eines bestimmten Elements innerhalb eines Tuples zurück. Wenn das angegebene Element nicht im Tuple gefunden wird, wird eine ValueError-Exception geworfen.

test_tuple = ("JBerries", "is", "awesome")
print(test_tuple.index("awesome"))
# Ausgabe: 2

print(test_tuple.index("nope"))
# ValueError: tuple.index(x): x not in tuple

Die sorted()-Funktion gibt ein neues, sortiertes Tuple aus den Elementen des ursprünglichen Tuples zurück, die in aufsteigender Reihenfolge angeordnet sind. Diese Funktion benötigt keine zusätzlichen Argumente, da sie einfach die vorhandenen Elemente umsortiert. Wenn das Tuple Elemente mit unterschiedlichen Typen enthält, wird eine Exception geworfen.

test_tuple = ("c", "b", "a")
sorted(test_tuple)
# Ausgabe: ['a', 'b', 'c']

test_tuple = (True, 1, "JBerries")
sorted(test_tuple)
# TypeError: '<' not supported between instances of 'str' and 'int'

Die min()- und max()-Funktionen geben die kleinsten und größten Werte in einem Tuple zurück. Beachte, dass wie bei sorted() diese Methoden nur funktionieren, wenn alle Elemente im Tuple vom gleichen Datentyp sind; wenn das Tuple Elemente mit unterschiedlichen Typen enthält, wird ein TypeError geworfen.

test_tuple = ("c", "b", "a")
min(test_tuple)
# Ausgabe: 'a'
max(test_tuple)
# Ausgabe: 'c'

test_tuple = ("c", "b", "a", 123)
min(test_tuple)
# TypeError: '>' not supported between instances of 'int' and 'str'

Tuple-Elemente Abfragen

Zugriff auf die Tuple-Elemente erfolgt über ihre Indizes mit eckigen Klammern [index]:

test_tuple = ("JBerries 1", "JBerries 2", "JBerries 3", "JBerries 4", "JBerries 5", "JBerries 6")
print(test_tuple[0])
# Ausgabe: JBerries 1

Man kann auch negative Indizes verwenden, um Elemente vom Ende des Tuples aus abzufragen, wobei -1 auf das letzte Element, -2 auf das zweitletzte Element usw. verweist:

test_tuple = ("JBerries 1", "JBerries 2", "JBerries 3", "JBerries 4", "JBerries 5", "JBerries 6")
print(test_tuple[-1])
# Ausgabe: JBerries 6

Über einen Indexbereich können mehrere Elemente eines Tuples abgefragt werden, dabei wird ein neues Tupel mit den ausgewählten Elementen zurückgegeben.

test_tuple = ("JBerries 1", "JBerries 2", "JBerries 3", "JBerries 4", "JBerries 5", "JBerries 6")
print(test_tuple[2:4])
# In diesem Fall umfasst der Bereich die Elemente von Index 2 bis Index 4 (nicht enthalten!).
# Ausgabe: ('JBerries 3', 'JBerries 4')

Ohne den End-Index, werden die Elemente bis zum Ende des Tuples zurückgegeben:

test_tuple = ("JBerries 1", "JBerries 2", "JBerries 3", "JBerries 4", "JBerries 5", "JBerries 6")
print(test_tuple[:4])
# Ausgabe: ('JBerries 1', 'JBerries 2', 'JBerries 3', 'JBerries 4')

Man kann auch individuelle Elemente aus einem Tuple "auspacken" und in separaten Variablen speichern:

test_tuple = ("foo", "bar", "baz")

(test_1, test_2, test_3) = test_tuple

print(test_1) # foo
print(test_2) # bar
print(test_3) # baz

Tuples und Iteration

Über eine for-Schleife kann man am einfachsten über die Tupel-Elemente iterieren:

test_tuple = ("JBerries", "is", "awesome")
for x in test_tuple:
    print(x)

Wenn man dazu auch die Indexnummern haben möchte, dann bietet sich die Verwendung von range() in Kombination mit der len()-Funktion an:

test_tuple = ("JBerries", "is", "awesome")
test_tuple_range = range(len(test_tuple))
# range(0, 3)
for i in test_tuple_range:
    print(test_tuple[i])

Das kann man auch alternativ mit einer while-Schleife implementieren:

test_tuple = ("JBerries", "is", "awesome")
i = 0
while i < len(test_tuple):
    print(test_tuple[i])
    i += 1

Operationen an Tuples

Hinzufügen oder Ändern der Items

Es ist nicht vorgesehen, dass man die Elemente eines Tupels bearbeiten oder neue Elemente hinzufügen kann. Für diesen Fall ist nur der Umweg über die Konvertierung zu einer Liste und anschließend erstellung eines neuen Tuples möglich:

test_tuple = ("JBerries", "is", "awesome")
test_tuple_as_list = list(test_tuple)
test_tuple_as_list[2] = "fantastic"
test_tuple_as_list.append("!")

test_tuple_new = tuple(test_tuple_as_list)
print(test_tuple_new)
# Ausgabe: ('JBerries', 'is', 'fantastic', '!')

Hinzufügen (Verknüpfen) von Tuples

Tuples können mit dem +-Operator zu einem neuen Tupel zusammengeführt werden.

tuple_1 = ("JBerries",)
tuple_2 = ("is", "fantastic")
tuple_1 += tuple_2

print(tuple_1)
# Ausgabe: ('JBerries', 'is', 'fantastic')

Replikation (Multiplizieren) von Tuples

Man kann den *-Operator verwenden, um den Inhalt eines Tuples zu replizieren oder zu wiederholen, wodurch effektiv eine neue Sequenz mit denselben Elementen erstellt wird:

test_tuple = ("JBerries 1", "JBerries 2")
test_tuple_x2 = test_tuple * 2

print(test_tuple_x2)  # ('JBerries 1', 'JBerries 2', 'JBerries 1', 'JBerries 2')

Das war's! Du solltest jetzt ein solides Verständnis dafür haben, wie man mit Tuples in Python arbeiten kann. Diesen Artikel haben wir auch auf unserer englischsprachigen Seite veröffentlicht: Everything About Tuples in Python