Sequentielle Datentypen¶
Einführung¶

Sequenzen sind geordnete Sammlungen, auf deren Elemente typischerweise über Indizes zugegriffen werden kann. Zu den wichtigsten eingebauten Sequenztypen gehören str, list, tuple, range, bytes und bytearray. memoryview stellt zusätzlich eine Sicht auf binäre Daten bereit.
Die Typen unterscheiden sich insbesondere darin, ob sie veränderlich sind: Listen und Bytearrays sind mutable, Strings, Tupel, range-Objekte und bytes dagegen immutable.
Viele Operationen sind für verschiedene Sequenztypen gleich: len(), Indizierung, Slicing, Iteration und – soweit vom jeweiligen Typ unterstützt – Konkatenation und Wiederholung.
text = "Auf Listen und Strings kann über Indizes zugegriffen werden!"
print(text[0], text[11], text[-2])
Zugriff auf Listen:
lst = ["Wien", "London", "Paris", "Berlin", "Zürich", "Hamburg"]
print(lst[0])
print(lst[2])
print(lst[-1])
Im Gegensatz zu anderen Programmiersprachen verwendet Python die gleichen Syntax- und Funktionsnamen, um sequentielle Datentypen zu bearbeiten. Beispielsweise kann die Länge eines Strings, einer Liste und eines Tupels mit einer Funktion namens len () bestimmt werden:
Länder = ["Deutschland", "Schweiz", "Österreich",
"Frankreich", "Belgien", "Niederlande",
"England"]
len(Länder) # die Länge der Liste; die Anzahl der Objekte
fib = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
len(fib)
Bytes¶
Ein bytes-Objekt ist eine unveränderliche Sequenz von Ganzzahlen im Bereich 0 bis 255. Seine Darstellung verwendet aus praktischen Gründen ASCII-Zeichen für druckbare Bytewerte, aber bytes ist kein Texttyp. Text wird in Python mit str dargestellt.
Zwischen Text und Bytes wird explizit konvertiert: str.encode() kodiert Text, bytes.decode() dekodiert Bytes. Für Web- und Datenaustausch ist UTF-8 sehr häufig die passende Kodierung.
s = "Glückliche Fügung"
s_bytes = s.encode('utf-8')
s_bytes
Strings: Wertgleichheit und Identität¶
Strings (str) sind unveränderliche Sequenzen von Unicode-Codepoints. Zwei Strings vergleicht man inhaltlich mit == bzw. !=. Der Operator is prüft dagegen, ob zwei Namen dasselbe Objekt bezeichnen, und ist kein Ersatz für einen Stringvergleich. Implementierungsdetails wie String-Interning dürfen daher nicht zur Programmlogik benutzt werden.
Für Singletons wie None ist is dagegen die übliche Schreibweise, beispielsweise x is None.
text = "Python"
kopie = "".join(["Py", "thon"])
print(text == kopie) # gleicher Wert
print(text is None) # Identitätsvergleich mit einem Singleton
Python-Listen¶
Bisher haben wir bereits einige Listen verwendet, und hier folgt eine angemessene Einführung. Listen beziehen sich auf Arrays von Programmiersprachen wie C, C ++ oder Java, aber Python-Listen sind weitaus flexibler und leistungsfähiger als "klassische" Arrays. Beispielsweise müssen nicht alle Elemente in einer Liste denselben Typ haben. Darüber hinaus können Listen in einem Programmlauf wachsen, während in C die Größe eines Arrays zur Kompilierungszeit festgelegt werden muss.
Im Allgemeinen ist eine Liste eine Sammlung von Objekten. Genauer gesagt: Eine Liste in Python ist eine geordnete Gruppe von Elementen oder Elementen. Es ist wichtig zu beachten, dass diese Listenelemente nicht vom gleichen Typ sein müssen. Es kann eine beliebige Mischung von Elementen wie Zahlen, Zeichenfolgen, anderen Listen usw. sein. Der Listentyp ist für Python-Skripte und -Programme unerlässlich. Mit anderen Worten, Sie werden ohne Liste kaum ernsthaften Python-Code finden.
Die Haupteigenschaften von Python-Listen:
• Sie sind ordentlich.
• Sie enthalten beliebige Objekte.
• Auf Elemente einer Liste kann über einen Index zugegriffen werden.
• Sie können beliebig verschachtelt werden. Sie können andere Listen als Unterlisten enthalten.
• Variable Größe
• Sie sind veränderlich. Die Elemente einer Liste können geändert werden.
Listennotation und Beispiele¶
Listenobjekte werden in eckige Klammern eingeschlossen und durch Kommas getrennt. Die folgende Tabelle enthält einige Beispiele für Listen:
| Listen | Beschreibung |
|---|---|
| [] | Eine leere Liste |
| [1, 1, 2, 3, 5, 8] | Eine Liste mit ganzen Zahlen |
| [42, "What's the question?", 3.1415] | Eine Liste mit gemischten Datentypen |
| ["Stuttgart", "Freiburg", "München", "Nürnberg", "Würzburg", "Ulm", "Friedrichshafen", "Zürich", "Wien"] | Eine Liste von Strings |
| [["London", "England", 7556900], ["Paris", "France",2193031], ["Bern", "Switzerland", 123466]] | Eine verschachtelte Liste |
| ["Oberste Ebene", ["Ein Level runter", ["noch tiefer", ["und tiefer", 42]]]] | Eine tief verschachtelte Liste |
Zugriff auf Listenelemente¶
Zuweisen einer Liste zu einer Variablen:
Sprachen = ["Python", "C", "C++", "Java", "Perl"]
Es gibt verschiedene Möglichkeiten, auf die Elemente einer Liste zuzugreifen. Der wahrscheinlich einfachste Weg für C-Programmierer sind Indizes. Die Nummern der Listen werden beginnend mit 0 aufgelistet:
Sprachen = ["Python", "C", "C++", "Java", "Perl"]
print(Sprachen[0] + " sind " + Sprachen[1] + " unterschiedlich!")
print("Zugriff auf das letzte Element der Liste: " + Sprachen[-1])
Das vorherige Beispiel einer Liste war eine Liste mit Elementen gleichen Datentyps. Wie wir bereits gesehen haben, können Listen verschiedene Datentypen haben, wie im folgenden Beispiel gezeigt:
Gruppe = ["Bob", 23, "George", 72, "Myriam", 29]
Unterlisten¶
Listen können Unterlisten als Elemente enthalten. Diese Unterlisten können auch Unterlisten enthalten, d. H. Listen können durch Unterlistenstrukturen rekursiv erstellt werden.
Person = [["Marc", "Mayer"], ["17, Oxford Str", "12345", "London"], "07876-7876"]
Name = Person[0]
print(Name)
Vor_name = Person[0][0]
print(Vor_Name)
Nach_name = Person[0][1]
print(Nach_name)
Adresse = Person[1]
Straße = Person[1][0]
print(Straße)
Das nächste Beispiel zeigt eine komplexere Liste mit einer tief strukturierten Liste:
komplexe_Liste = [["a", ["b", ["c", "x"]]]]
komplexe_Liste = [["a", ["b", ["c", "x"]]], 42]
komplexe_Liste[0][1]
komplexe_Liste[0][1][1][0]
Listen ändern¶
Sprachen = ["Python", "C", "C++", "Java", "Perl"]
Sprachen[4] = "Lisp"
Sprachen
Sprachen.append("Haskell")
Sprachen
Sprachen.insert(1, "Perl")
Sprachen
Einkaufsliste = ['Milch', 'Joghurt', 'Ei', 'Butter', 'Brot', 'Bananen']
Wir gehen in einen virtuellen Supermarkt. Holen Sie sich einen Einkaufswagen und beginnen Sie mit dem Einkauf:
Einkaufsliste = ['Milch', 'Joghurt', 'Ei', 'Butter', 'Brot', 'Bananen']
Einkaufswagen = []
# "pop()"" Entfernt das letzte Element der Liste und gibt es zurück
Artikel = Einkaufsliste.pop()
print(Artikel, Einkaufsliste)
Einkaufswagen.append(Artikel)
print(Einkaufswagen)
# wir machen so weiter:
Artikel = Einkaufsliste.pop()
print("shopping_list:", Einkaufsliste)
Einkaufswagen.append(Artikel)
print("cart: ", Einkaufswagen)
Mit einer while-Schleife:
Einkaufsliste = ['milk', 'yoghurt', 'egg', 'butter', 'bread', 'bananas']
Einkaufswagen = []
while Einkaufsliste != []:
Artikel = Einkaufsliste.pop()
Einkaufswagen.append(Artikel)
print(Artikel, Einkaufsliste, Einkaufswagen)
print("Einkaufsliste: ", Einkaufsliste)
print("Einkaufswagen: ", Einkaufswagen)
Tupel¶
Ein Tupel ist eine unveränderliche Sequenz. Es ähnelt in vielen Operationen einer Liste, ist aber nicht einfach eine „unveränderliche Liste“: Tupel werden häufig für feste Datensätze mit mehreren Feldern verwendet, etwa (name, alter, ort).
Entscheidend für die Tupel-Syntax ist das Komma, nicht die Klammer. So ist 42, bereits ein 1-Tupel; Klammern werden meist zur besseren Lesbarkeit verwendet.
Die Struktur eines Tupels kann nach seiner Erzeugung nicht verändert werden. Seine Elemente können jedoch selbst veränderliche Objekte sein. Deshalb ist auch nicht jedes Tupel hashbar. Ein Tupel kann nur dann beispielsweise als Dictionary-Schlüssel oder Set-Element verwendet werden, wenn alle für den Hash relevanten enthaltenen Objekte ebenfalls hashbar sind.
t = ("Tupels", "sind", "unveränderlich")
t[0]
t[0] = "Zuordnungen zu Elementen sind nicht möglich"
Ausschneiden / Slicing¶
In vielen Programmiersprachen kann es ziemlich schwierig sein, einen Teil eines Strings zu schneiden, und noch schwieriger, wenn Sie ein "Subarray" ansprechen möchten. Python macht es mit seinem Slice-Operator sehr einfach. Slicing wird häufig in anderen Sprachen als Funktion mit möglichen Namen wie "Teilstring", "gstr" oder "substr" implementiert.
Jedes Mal, wenn Sie einen Teil eines Strings oder einer Liste in Python extrahieren möchten, sollten Sie den Slice-Operator verwenden. Die Syntax ist einfach. Eigentlich sieht es ein bisschen so aus, als würde man auf ein einzelnes Element mit einem Index zugreifen, aber statt nur einer Zahl haben wir mehr, getrennt durch einen Doppelpunkt ":". Wir haben einen Start- und einen Endindex, einer oder beide fehlen möglicherweise. Es ist am besten, die Funktionsweise von Slice anhand von Beispielen zu untersuchen:
Slogan = "Python ist großartig"
erste_fünf = Slogan[0:5]
erste_fünf
ab_fünf = Slogan[5:]
ab_fünf
eine_Kopie = Slogan[:]
ohne_letzte_fünf = Slogan[0:-5]
ohne_letzte_fünf
Syntaktisch gibt es keinen Unterschied bei Listen. Wir werden mit europäischen Städtenamen zu unserem vorherigen Beispiel zurückkehren:
Städte = ["Wien", "London", "Paris", "Berlin", "Zürich", "Hamburg"]
erste_drei = Städte[0:3]
# oder einfacher:
erste_drei = Städte[:3]
print(erste_drei)
Jetzt extrahieren wir alle Städte außer den letzten beiden, "Zürich" und "Hamburg":
alles_außer_letzte_zwei = Städte[:-2]
print(alles_außer_letzte_zwei)
Das Slicing kann ein drittes Argument, die Schrittweite, verwenden:
s[start:stop:step]
start ist inklusive, stop exklusiv. Eine positive Schrittweite läuft nach rechts; eine negative Schrittweite kann eine Sequenz rückwärts durchlaufen. Fehlende Grenzen werden passend zur Richtung ergänzt.
Für positive Schrittweite werden also die Indizes start, start + step, start + 2*step, ... verwendet, solange der jeweilige Index vor stop liegt. Negative Indizes und negative Schrittweiten werden von Python entsprechend den allgemeinen Slice-Regeln normalisiert.
Im folgenden Beispiel definieren wir eine Zeichenfolge und drucken jedes dritte Zeichen dieser Zeichenfolge:
Slogan = "Python unter Linux ist großartig"
Slogan[::3]
Die folgende Zeichenfolge, die wie ein Buchstabensalat aussieht, enthält zwei Sätze. Eine davon enthält verdeckte Werbung für meine Python-Kurse in Kanada:
"TPoyrtohnotno ciosu rtshees lianr gTeosrto nCtiot yb yi nB oCdaennasdeao"
Versuchen Sie, den versteckten Satz mit Slicing herauszufinden. Die Lösung besteht aus 2 Schritten!
s = "TPoyrtohnotno ciosu rtshees lianr gTeosrto nCtiot yb yi nB oCdaennasdeao"
print(s)
s[::2]
s[1::2]
Vielleicht interessiert Sie auch, wie wir den String erstellt haben. Sie müssen das Listenverständnis verstehen, um Folgendes zu verstehen:
s = "Toronto is the largest City in Canada"
t = "Python courses in Toronto by Bodenseo"
s = "".join(["".join(x) for x in zip(s,t)])
s
Länge¶

Die Länge einer Sequenz, d. H. Einer Liste, eines Strings oder eines Tupels, kann mit der Funktion len () bestimmt werden. Bei Zeichenfolgen wird die Anzahl der Zeichen und bei Listen oder Tupeln die Anzahl der Elemente gezählt, während eine Unterliste als ein Element zählt.
txt = "Hallo Welt"
len(txt)
a = ["Swen", 45, 3.54, "Basel"]
len(a)
Verkettung von Sequenzen¶
Das Kombinieren von zwei Sequenzen wie Zeichenfolgen oder Listen ist so einfach wie das Addieren von zwei Zahlen. Sogar das Bedienerzeichen ist das gleiche. Das folgende Beispiel zeigt, wie zwei Zeichenfolgen zu einer verkettet werden:
Vorname = "Homer"
Nachname = "Simpson"
Name = Vorname + " " + Nachname
print(Name)
So einfach ist das für Listen:
Farben1 = ["rot", "grün","blau"]
Farben2 = ["schwarz", "weiß"]
Farben = Farben1 + Farben2
print(Farben)
Die erweiterte Zuweisung += ist nicht allgemein dasselbe wie s = s + t. Der linke Zielausdruck wird nur einmal ausgewertet, und veränderliche Typen können die Operation in-place ausführen.
Bei Listen erweitert += die vorhandene Liste typischerweise um die Elemente des Iterables. Bei unveränderlichen Sequenzen wie Strings und Tupeln entsteht dagegen ein neues Objekt.
Überprüfen, ob ein Element enthalten ist¶
Mit in und not in lässt sich die Zugehörigkeit prüfen.
abc = ["a","b","c","d","e"]
"a" in abc
"a" not in abc
"e" not in abc
"f" not in abc
Slogan = "Python ist einfach!"
"y" in Slogan
"x" in Slogan
Wiederholungen¶
Bisher hatten wir einen "+" - Operator für Sequenzen. Es ist auch ein "∗" - Operator verfügbar. Natürlich ist keine "Multiplikation" zwischen zwei Sequenzen möglich. "*" ist für eine Sequenz und eine ganze Zahl definiert, d. h. "s ∗ n" oder "n ∗ s". Es ist eine Art Abkürzung für eine n-fache Verkettung, d.h.
str ∗ 4
ist das gleiche wie
str + str + str + str
Weitere Beispiele:
3 * "xyz-"
"xyz-" * 3
3 * ["a","b","c"]
Die erweiterte Zuordnung für "∗" kann ebenfalls verwendet werden:
s *= n ist dasselbe wie s = s * n.
Die Fallstricke von Wiederholungen¶
In unseren vorherigen Beispielen haben wir den Wiederholungsoperator auf Zeichenfolgen und flache Listen angewendet. Wir können es auch auf verschachtelte Listen anwenden:
x = ["a","b","c"]
y = [x] * 4
y
y[0][0] = "p"
y

Dieses Ergebnis ist für Anfänger der Python-Programmierung ziemlich erstaunlich. Wir haben dem ersten Element der ersten Unterliste von y einen neuen Wert zugewiesen, dh y [0] [0], und wir haben die ersten Elemente aller Unterlisten in y "automatisch" geändert, dh y [1] [0]. , y [2] [0], y [3] [0].
Der Grund ist, dass der Wiederholungsoperator * 4 4 Verweise auf die Liste x erstellt: und es ist daher klar, dass jedes Element von y geändert wird, wenn wir einen neuen Wert auf y [0] [0] anwenden.
