Listen
Inhalt
Listen¶
(Fortgeschrittene)
Nachdem wir die Grundlagen von Listen schon kennen gelernt haben, wollen wir uns hier mit Details beschäftigen. Als erstes sollen verschiedene Möglichkeiten der Listenerstellung bzw. deren Initialisierung gezeigt werden. Danach werden verschieden Themen angesprochen. Das Theme Indexierung und Slicing werden wir ausführlich besprechen, weil es besonders wichtig ist. Zum Schluss soll das Anwenden von BuiltIn Funktionen und Klassenmethoden gezeigt werden.
Fortgeschrittene Techniken¶
Listen anlegen¶
Durch das Kombinieren verschiedener Sprachelemente, Operatoren und Built-In Funktionen, können Listen in Python erzeugt werden.
Wir können eine Liste von Strings erzeugen in dem wir den *
Operator verwenden. Die Liste ist also mit einem Defaultelement initialisiert.
list_ = ['a']*5
list_
['a', 'a', 'a', 'a', 'a']
Als Variablenamen haben wir list_
verwendet, da list
selbst ein Schlüsselwort ist. In Python ist es dann üblich eine Variable mit Unterstrich zu verwenden.
Dasselbe Vorgehen ist mit Zahlen möglich.
list_ = [0]*10
list_
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Wollen wir einen Bereich von Zahlen definieren können wir dazu list()
und range()
verwenden.
list_ = list(range(0,10))
list_
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
list_ = list(range(9,-1,-1))
list_
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Dasselbe Ergebnis können wir mit einer einfachen for
-Schleife errreichen.
list1 = [i for i in range(0,10)]
list1
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Dieses Muster ist geeignet um eine Liste mit einer flexiblen Initialisierung zu erreichen.
list1 = [i*i for i in range(0,10)]
list1
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
list1 = [i%2 for i in range(0,10)]
list1
[0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
Listen sind geordnet¶
Listen sind geordnete Objekte. Das können wir mit dem Oeprator ==
überprüfen.
list1 = ['a', 'b', 'c']
list2 = ['a', 'b', 'c']
list1 == list2
True
Wir sehen also, dass Python beide Listen als gleich ansieht.
Wenn wir dageben die Element in list2
anders anordnen, so werden diese Listen als verschieden angegesehen.
list1 = ['a', 'b', 'c']
list2 = ['c', 'b', 'a']
list1 == list2
False
Erzeugen wir mit list2[::-1]
eine Umkehrung der Elemente, so werden die beiden Liste wieder als diesselben angesehen.
list1 == list2[::-1]
True
Listen mit willkürlichen Objekten¶
Oft beinhalten Listen Objekte des gleichen Datentyps, z.B. nur Zahlen.
list1 = [1, 2, 3, 4]
list1
[1, 2, 3, 4]
Eine Liste kann aber verschiedene Datentype gleichzeitig beinhalten.
list1 = ['int', 1, 'float', 2.0, 'complex', 1+2j, 'boolean', True, None]
list1
['int', 1, 'float', 2.0, 'complex', (1+2j), 'boolean', True, None]
Indexierung und Schneiden¶
Die Indexierung und das Schneiden (engl. Indexing and Slicing) sollte in jedem Fall genau studiert werden.
Definieren wir eine Liste mit Zahlen von 0 bis 4.
l = [0, 1, 2, 3, 4]
print(l)
print(len(l))
[0, 1, 2, 3, 4]
5
Die Liste hat also 5 Elemente mit den Einträgen von 0 bis 4.
Auf das erste Element können wir mit dem Index 0 zugreifen.
l[0]
0
Wollen wir das 2, 3 und 4 Element gemeinsam selektieren, so können wir das mit der Synthax 1:4
erreichen. Die Zählung beginnt in Python mit Null.
l[1:4]
[1, 2, 3]
Oft sind wir nur an dem vordernen oder dem hinteren Teil einer Liste interessiert.
l[1:]
[1, 2, 3, 4]
l[:4]
[0, 1, 2, 3]
Mit der Synthax [:]
ist es auch möglich alle Elemente gemeinsam selektieren.
l[:]
[0, 1, 2, 3, 4]
Diese Synthax erscheint auf den ersten Blick sinnlos, da wir wieder die ursprüngliche Liste erhalten. Ein Überprüfung der Adresse zeigt uns jedoch den Unterschied. Mit [:]
wurde eine neue Liste erzeugt.
print(l)
print(l[:])
print(id(l))
print(id(l[:]))
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4]
139820714777152
139820453997568
l[::2]
[0, 2, 4]
l[0:4:2]
Um auf des letzte bzw. auf das vorletze Element zuzugreifen, könnten wir versucht sein, das mit len(l)-1
zu erreichen.
l[len(l)-1]
4
l[len(l)-2]
3
Dieses Vorgehen ist gültig und liefert das geschwünscht Ergebnis, jedoch gibt es einen eleganteren Weg. Python erlaubt das Verwenden eines negativen Indexes. Somit können wir mit -1 und -2 das letzte und das vorletze Element selektieren.
l[-1]
4
l[-2]
3
Die Umkehrung der Liste ist uns schon bekannt.
l[::-1]
[4, 3, 2, 1, 0]
Mit der Syntax des doppelten Doppelpunktes kann auch wieder die Schrittweite gesteuert werden.
l[-1:-4:-2]
[4, 2]
Entpacken von Listen¶
Listen lassen sich auf Vielfältige Weise entpacken. Zum Beipiel können wir für jedes Element eine eigene Variable definieren.
list1 = ['a','b','c','d']
a, b, c, d = list1
a
'a'
Mit dem *
Operator können wir gezielt Listen in Teile zerlegen. Also jene Elemente welche eine eigene Variable bekommen und dem Rest.
list1 = ['a','b','c','d']
*head, tail = list1
print(head)
print(tail)
['a', 'b', 'c']
d
list1 = ['a','b','c','d']
head, *tail = list1
print(head)
print(tail)
a
['b', 'c', 'd']
Sind wir an dem Rest nicht interessiert, so können wir wie üblich den Unterstrich _
als Platzhalter verwenden.
list1 = ['a','b','c','d']
head, *_, tail = list1
print(head)
print(tail)
a
d
_, _, _, d = list1
d
'd'
Listen (in und not in)¶
Die Operatoren in
und not in
erlauben das Überprüfen einer Liste auf das Vorhanden sein von Elementen.
'a' in list1
True
'x' in list1
False
'a' not in list1
False
'x' not in list1
True
Liste von Listen¶
Eine Liste von Listen ist eine sehr praktische Strukture um Daten zu speichern.
list1 = [1]*5
list2 = [2]*3
list3 = [3]*7
list_all = [list1, list2, list3]
list_all
[[1, 1, 1, 1, 1], [2, 2, 2], [3, 3, 3, 3, 3, 3, 3]]
Verschachtelte Listen¶
Auch verschachtelte Listen lassen sich erzeugen. Bei dieser Datenstruktur ist jedoch Vorsicht geboten. Wir können schnell den Überblick verlieren:
list1 = ['a', ['aa', ['aaa', 'bbb'], 'bb'], 'b']
list1
['a', ['aa', ['aaa', 'bbb'], 'bb'], 'b']
print(list1[0])
print(list1[1])
print(list1[2])
a
['aa', ['aaa', 'bbb'], 'bb']
b
print(list1[1][0])
print(list1[1][1])
print(list1[1][2])
aa
['aaa', 'bbb']
bb
'a' in list1
True
'aa' in list1
False
'aa' in list1[1]
True
Listen Elemente verändern¶
Die Elemente einer Liste können verändert werden.
list1 = ['a','b','c','d']
list1[0] = 'x'
Listen Methoden¶
Die Built-in Funktionen len()
, min()
, max()
und list()
werden oft mit Listen benutzt. Listen besitzen auch eine Vielzahl von Klassen Methoden. Wir können wieder dir()
nutzen, um alle Methoden der List-Klasse zu bekommen.
def get_all_class_methods(class_):
""" get all class methods, using dir"""
list_methods = [name for name in dir(class_) if name.islower() and name[0] !='_']
return list_methods
list_methods = get_all_class_methods(list)
print(len(list_methods))
print(list_methods)
11
['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
Name |
Typ |
Operation |
Beschreibung |
---|---|---|---|
len() |
Built-In |
Länge der Liste |
|
min() |
Built-In |
Element welches dem Minimum entspricht |
|
max() |
Built-In |
Element welches dem Maximum entspricht |
|
list() |
Built-In |
Erzeugt |
Erzeugt eine Liste |
append() |
Methode |
Hinzufügen |
Hinzufügen von Element |
extend() |
Methode |
Hinzufügen |
Hinzufügen von Element |
insert() |
Methode |
Hinzufügen |
Hinzufügen von Element |
pop() |
Methode |
Entfernen |
Entfernt Elemente |
remove() |
Methode |
Entfernen |
Entfernt Elemente |
clear() |
Methode |
Entfernen |
Leert die Liste |
del |
Schlüsselwort |
Entfernen |
Entfernt Elemente |
copy() |
Methode |
Kopieren |
Ezeugt eine flache Kopie |
reverse() |
Methode |
Sonstiges |
Erzeugt eine Umkehrung |
sort() |
Methode |
Sonstiges |
Sortiert die Liste |
count() |
Methode |
Sonstiges |
Zählen eines Elements |
index() |
Methode |
Sonstiges |
Sucht die Position eines Elementes |
len()¶
Bemerkung
len()
liefert die Länge der Liste. Wenn die Liste wieder Listen enthält dann wird die Unterliste als ein Element aufgefasst.
len(list)
list1 = [1, 2, 3, -2, -1]
print(len(list1))
list2 = [1, 2, 3, [-2, -1]]
print(len(list2))
5
4
min()¶
Bemerkung
min()
liefert das Element welches dem Minimum entspricht. Die Elemente müssen vergleichbar sein, dass heißt vom selben Typ.
min(list)
list1 = [1, 2, 3, -2, -1]
print(min(list1))
-2
list1 = ['b', 'c', 'a', 'e', 'd']
print(min(list1))
a
max()¶
Bemerkung
min()
liefert das Element welches dem Maximum entspricht. Die Elemente müssen vergleichbar sein, dass heißt vom selben Typ.
max(list)
list1 = [1, 2, 3, -2, -1]
print(max(list1))
3
list1 = ['b', 'c', 'a', 'e', 'd']
print(min(list1))
a
list()¶
Bemerkung
Die Built-In Funktion list()
kann benutzt werden um ein List Objekt zu erzeugen. Wir können Listen zum Beispiel aus Tuple oder Strings erzeugen. Auch eine leere Liste kann erzeugt werden.
list(seq)
aTuple = ('Mechanik','Elektonik','Informatik')
list1 = list(aTuple)
list1
['Mechanik', 'Elektonik', 'Informatik']
str = "Hallo Welt!"
list(str)
['H', 'a', 'l', 'l', 'o', ' ', 'W', 'e', 'l', 't', '!']
empty = list()
empty
[]
append()¶
Bemerkung
Die append()
Methode erlaubt das Anhängen von Objekten. Äquivalent zu l[len(l):] = [x]
.
list.append(x)
list1 = ['Mechanik','Elektonik']
print(list1)
list1.append('Informatik')
print(list1)
['Mechanik', 'Elektonik']
['Mechanik', 'Elektonik', 'Informatik']
list1 = ['Mechanik','Elektonik']
print(list1)
list1[len(list1):] = ['Informatik','Software']
print(list1)
['Mechanik', 'Elektonik']
['Mechanik', 'Elektonik', 'Informatik', 'Software']
list2 = ['a','b']
list2.append([1, 2, 3])
list2
['a', 'b', [1, 2, 3]]
list3 = ['a','b']
list3 = list3 + [[1, 2, 3]]
list3
['a', 'b', [1, 2, 3]]
list2 = ['a','b']
list2.append((1, 2, 3))
list2
['a', 'b', (1, 2, 3)]
list3 = ['a','b']
list3 = list3 + [(1, 2, 3)]
list3
['a', 'b', (1, 2, 3)]
list1 = [1]*5
list2 = [2]*5
list3 = [3]*5
list_all2 = []
list_all2.append(list1)
list_all2.append(list2)
list_all2.append(list3)
list_all2
[[1, 1, 1, 1, 1], [2, 2, 2, 2, 2], [3, 3, 3, 3, 3]]
extend()¶
Bemerkung
Die extend()
Methode verlängert eine vorhanden Liste.
list.extend(obj)
list1 = ['Mechanik','Elektonik','Informatik']
print(list1)
list2 = ['Kybernetik','Robotik']
list1.extend(list2)
print(list1)
['Mechanik', 'Elektonik', 'Informatik']
['Mechanik', 'Elektonik', 'Informatik', 'Kybernetik', 'Robotik']
list2 = ['a','b']
list2.extend([1, 2, 3])
list2
['a', 'b', 1, 2, 3]
list3 = ['a','b']
list3 += [1, 2, 3]
list3
['a', 'b', 1, 2, 3]
insert()¶
Bemerkung
Mit der insert()
Methode können Elemente mit Hilfe eines Index eingefügt werden.
list.insert(i, x)
list1 = ['b','d']
list1.insert(0,'a')
list1.insert(2,'c')
list1
['a', 'b', 'c', 'd']
pop()¶
Bemerkung
pop()
entfernt das letzte Element einer Liste. Wenn zusätzlich ein Index angegeben ist, wird stattdessen das zum Index gehörige Element entfernt.
list.pop([i])
list1 = ['Mechanik','Elektonik','Informatik']
list1.pop()
list1
['Mechanik', 'Elektonik']
list1 = ['Mechanik','Elektonik','Informatik']
list1.pop(1)
list1
['Mechanik', 'Informatik']
remove()¶
Bemerkung
remove()
entfernt das erste Element aus der Liste, dessen Wert gleich x ist.
list.remove(x)
list1 = ['Mechanik','Elektonik','Informatik']
list1.remove('Elektonik')
list1
['Mechanik', 'Informatik']
list1 = ['Mechanik','Elektonik','Informatik','Elektonik']
list1.remove('Elektonik')
print(list1)
list1.remove('Elektonik')
print(list1)
['Mechanik', 'Informatik', 'Elektonik']
['Mechanik', 'Informatik']
clear()¶
Bemerkung
clear()
entfernt alle Elemente aus der Liste. Mit del l[:]
kann dasselbe erreicht werden.
list.clear()
list1 = ['Mechanik','Elektonik','Informatik']
print(list1)
list1.clear()
print(list1)
['Mechanik', 'Elektonik', 'Informatik']
[]
del¶
Bemerkung
del
ist ein Schlüsselwort das mit Listen funktioniert. del l[[a]:[b]]
entfernt alle Element welche sich im angegebenen Bereich befinden.
del l[[a]:[b]]
list1 = ['Mechanik','Elektonik','Informatik']
del list1[:]
list1
[]
list1 = ['Mechanik','Elektonik','Informatik']
del list1[1:]
list1
['Mechanik']
list1 = ['Mechanik','Elektonik','Informatik']
del list1[0]
list1
['Elektonik', 'Informatik']
copy()¶
Bemerkung
Die copy()
Methode erzeugt eine flache Kopie der Liste. Äquivalent zu l[:]
.
list.reverse()
list1 = ['Mechanik','Elektonik','Informatik']
list2 = list1.copy()
print(list2)
print(id(list1))
print(id(list2))
['Mechanik', 'Elektonik', 'Informatik']
139967215677632
139967215677568
list1 = ['Mechanik','Elektonik','Informatik', [0, 1]]
list2 = list1.copy()
list1[0] = 'Robotik'
list1[3][0] = 'a'
print(list1)
print(list2)
['Robotik', 'Elektonik', 'Informatik', ['a', 1]]
['Mechanik', 'Elektonik', 'Informatik', ['a', 1]]
reverse()¶
Bemerkung
Die reverse()
Methode erzeugt eine Umkehrung der Liste.
Es sei darauf hingewiesen das die reverse() Methode None
zurückgibt und die Liste selbst verändert. Man sagt auch diese Methode wirkt in-place.
list.reverse()
list1 = ['Mechanik','Elektonik','Informatik']
list1.reverse()
list1
['Informatik', 'Elektonik', 'Mechanik']
sort()¶
Bemerkung
Die sort()
Methode sortiert die Liste. Es sei darauf hingewiesen das die sort()
Methode None
zurückgibt und die Liste selbst verändert. Man sagt auch diese Methode wirkt in-place.
list.sort([reverse=True])
list1 = ['Mechanik','Elektonik','Informatik']
list1.sort()
list1
['Elektonik', 'Informatik', 'Mechanik']
list1 = ['Mechanik','Elektonik','Informatik']
list1.sort(reverse=True)
list1
['Mechanik', 'Informatik', 'Elektonik']
count()¶
Bemerkung
Wir können die Methode count()
verwenden um das Vorhanden sein eines Elements zu zählen.
list.count(obj)
list1 = ['Mechanik','Mechanik','Mechanik','Elektonik','Elektonik','Informatik']
print(list1.count('Mechanik'))
print(list1.count('Elektonik'))
print(list1.count('Informatik'))
3
2
1
index()¶
Bemerkung
Die index()
Methode ist sinnvoll um die erste Instanz eines Elements zu finden.
list.index(obj)
list1 = ['Mechanik','Elektonik','Informatik','Mechanik','Elektonik','Informatik']
print(list1.index('Informatik'))
2