Listen

Listen Methoden

Listen-Methoden sind Funktionen, die auf Listen angewendet werden. Methoden sind generell Funktionen die auf Objekte angewandt werden. In der folgenden Auflistung sind die wichtigsten Methoden von Listen aufgelistet, dabei geben die Methoden, die eine Liste nur modifizieren (wie insert, remove, sort o.a.) keinen Wert zurück, sondern nur None. In der Beschreibung von Methoden wird das Objekt (hier in diesem Fall list) vorangestellt und ist damit in der Regel nur ein Platzhalter für eine Variable, die eine Liste enthält oder eine Liste selbst.

  • list.append(x)

    Hinzufügen eines Elements an das Ende der Liste. Äquivalent zu a[len(a):] = [x].

  • list.extend(L)

    Erweitern der Liste mit allen Elementen der angegebenen Liste L. Äquivalent zu a[len(a):] = L.

  • list.insert(i, x)

    Einfügen eines ELements x an der angebenen Position i. Das erste Argument ist die Position (bzw. der Index) desjenigen Elements vor dem das neue Element eingefügt werden soll. Dies bedeutet, dass a.insert(0, x) das Element x vor die Liste anfügt und somit der neue Beginn der Liste wird und a.insert(len(a), x) ist damit äquivalent zu a.append(x).

  • list.remove(x)

    Löscht das erste Element aus der Liste, dessen Wert x ist. Falls kein solches Element existiert, wird eine Fehlermeldung geworfen.

  • list.pop([i])

    Lösche das Element an der angegebenen Position i und gebe den Wert dieses Elements zurück. Falls kein Index angegeben wird, löscht a.pop() das letzte Element der Liste und gibt dieses zurück. (Die eckigen Klammern um i in der oben aufgeführten Methode pop([i]) bedeuten, dass dieses Argument optional ist und nicht das die eckigen Klammern zur Positionsangabe mit angegeben werden müssen. Diese Notation wird sowohl in der Python Dokumentation als auch in anderen Dokumentationen zur Beschreibung eines festgelegten Sachverhalts verwendet und heisst Backus Naur Form bzw. Erweiterte Backus Naur Form.)

  • list.clear()

    Lösche alle Elemente der Liste. Äquivalent zu del a[:].

  • list.index(x)

    Gibt den Index von der ersten Position des Elements zurück, dessen Wert x ist. Falls kein solches Element existiert, wird eine Fehlermeldung geworfen.

  • list.count(x)

    Gibt die Anzahl zurück, wie oft der Wert x in der Liste erscheint.

  • list.sort(key=None, reverse=False)

    Sortiert die Elemente der Liste (die Argumente können für eine angepasste Sortierung verwendet werden, die genaue Bedeutung steht bei der Builtin-Funktion sorted()).

  • list.reverse()

    Kehrt die Reihenfolge der Liste um.

  • list.copy()

    Gibt eine Kopie der Liste zurück. Äquivalent zu a[:].

In [2]:
a = [2, 7, 5, 1, 4, 6, 3]
a.insert(5,3)
print(a)
[2, 7, 5, 1, 4, 3, 6, 3]
In [3]:
%%Mooc StringAssessment
Out[3]:

Einfügen in eine Liste

Gegeben sei der folgende Code


a = [2, 7, 5, 1, 4, 6, 3]

Fügen sie das Element 3 in die Liste a nach der 5. Stelle ein

Wie lautet der dazu gehörige Befehl ?



In [4]:
%%Mooc StringAssessment
Out[4]:

Zählen der Elemente in einer Liste

Gegeben sei der folgende Code


a = [2, 7, 5, 1, 4, 3, 6, 3]

Umgeben sie den entsprechenden Befehl noch mit einem Print-Befehl

Wie lautet der Befehl um die Anzahl der Elemente 3 auszugeben ?



In [5]:
%%Mooc StringAssessment
Out[5]:

Listensortierung 1

Gegeben sei der folgende Code


a = [2, 7, 5, 1, 4, 3, 6, 3]
a.sort()
print(a)

Welches Ergebnis wird durch den print-Befehl ausgegeben ?



In [6]:
%%Mooc StringAssessment
Out[6]:

Listensortierung 2

Gegeben sei der folgende Code


a = [2, 7, 5, 1, 4, 3, 6, 3].sort()
print(a)

Geben sie die Antwort so ein, wie die Liste als Ergebnis eines print-Befehls ausgegeben wird

Welches Ergebnis wird durch den print-Befehl ausgegeben ?



Stapelspeicher (Stack) als Beispiel einer Liste

In Mikroprozessoren wird der sogenannte Stapelspeicher eingesetzt, ein spezielles Register um z.B. die Rücksprungadressen von Funktionen abzulegen. Einen Stapelspeicher kann man sich vereinfacht als Stapel von z.B. Bierkisten vorstellen. Es kann immer nur eine neue Bierkiste oben auf den Stapel gepackt werden oder eine Bierkiste von oben heruntergenommen werden. Man kann also immer nur auf die oberste Bierkiste zugreifen und nicht auf die weiter unter im Stapel liegenden Bierkisten. Das Hinzulegen eines Objekt auf den Stapel wird push genannt und das Wegnehmen eines Objekts vom Stapel wird pop genannt. Das Prinzip des Stapelspeichers wird auch als Last-In - First-Out (LIFO) bezeichnet, umgangssprachlich übersetzt: was zuletzt reinkommt, kommt zuerst raus. Eine Liste kann nun mit den beiden Methoden append (welches push entspricht) und pop als Stapelspeicher fungieren:

In [7]:
stapelspeicher = ['eins', 'zwei', 'drei']
stapelspeicher.append('vier')
stapelspeicher.append('fünf')
print(stapelspeicher)
['eins', 'zwei', 'drei', 'vier', 'fünf']
In [8]:
letzterWert = stapelspeicher.pop()
print(letzterWert)
fünf
In [9]:
print(stapelspeicher)
['eins', 'zwei', 'drei', 'vier']
In [10]:
letzterWert = stapelspeicher.pop()
print(letzterWert)
vier
In [11]:
letzterWert = stapelspeicher.pop()
print(letzterWert)
drei
In [12]:
stapelspeicher.append('sechs')
print(stapelspeicher)
['eins', 'zwei', 'sechs']
In [13]:
%%Mooc StringAssessment
Out[13]:

Stapelspeicher - Türme von Hanoi

Gegeben seien die folgenden drei Stapel


s1 = [3, 2, 1]
s2 = []
s3 = []

Die entsprechenden Scheiben 3, 2, 1 auf dem Stab 1 sollen auf den Stab 3 umgesetzt werden, dabei darf eine kleinere Scheibe nur auf einer größeren Scheibe zu liegen kommen. Allerdings darf die Umsetzung mit Hilfe des Stabs 2 durchgeführt werden. Die ersten 3 Umsetzungen lauten daher:


s3.append(s1.pop())
s2.append(s1.pop())
s2.append(s3.pop())

Geben sie die Antwort hintereinander mit jeweils einem Semikolon getrennt ein.

Wie lauten die weiteren 4 Befehle zum Umsetzen der Türme?



Warteschlange (Queue) als Beispiel einer Liste

Eine Warteschlange kann man sich als Warteschlange vor einer Bäckereitheke verdeutlichen, der erste in der Schlange wird zuerst bedient, der letzte in der Schlange wird als letzter bedient. Im Gegensatz zu einem Stapelspeicher ist daher das Konzept einer Warteschlange das First-In, First-Out (FIFO)-Prinzip. Warteschlangen werden z.B. in der Datenkommunikation benutzt um die ausgehenden oder ankommenden Datenpakete zu verarbeiten. Auch eine Liste kann als Warteschlange eingerichtet werden. Listen sind dennoch nicht effizient für dieses Prinzip, während nämlich append und pop für den Stapelspeicher jeweils das letzte Element der Liste bearbeiten und damit ziemlich schnell und effizient durchgeführt wird, muss das append und pop für die Warteschlange jeweils das erste Element der Liste bearbeiten und dies ist - infolge des Verschiebens aller weiteren Elemente der Liste um eine Stelle - ziemlich langsam und wenig effizient. Es gibt jedoch in der Bibliothek collections eine Objektklasse deque, die genau für das Prinzip Warteschlange sehr effektiv für append, appendleft sowie pop und popleft an beiden Enden der Liste gestaltet und entwickelt worden. Eine Warteschlange ist somit wie folgt umsetzbar:

In [14]:
from collections import deque
queue = deque(["eins", "zwei", "drei"])
print(queue)
deque(['eins', 'zwei', 'drei'])
In [15]:
queue.append("vier")
queue.append("fünf")
print(queue)
deque(['eins', 'zwei', 'drei', 'vier', 'fünf'])
In [16]:
ersterWert = queue.popleft()
print(ersterWert)
eins
In [17]:
ersterWert = queue.popleft()
print(ersterWert)
zwei
In [18]:
print(queue)
deque(['drei', 'vier', 'fünf'])
In [19]:
%%Mooc StringAssessment
Out[19]:

Warteschlangen in der Datenkommunikation

Gegeben seien die folgenden beiden Queues


sender = deque([1, 2, 3, 4])
empfaenger = deque([])

Es sollen die Daten-Pakete 1,2,3,4 der Reihe nach vom Sender zum Empfänger geschickt werden. Wie würde eine Funktion send mit den beiden Argumenten sender und empfaenger lauten, die bei jedem Aufruf ein Paket vom sender zum empfaenger schickt und als Rückgabewert die Paketnr zurückgibt


paketnr = 0
def send(sender,empfaenger):
    global paketnr
    if len(sender):
        ...
        paketnr += 1
    return paketnr

Geben sie als Antwort den Befehl ein, der in der Zeile mit den 3 Punkten (...) stehen muss. Nach dem Versenden aller Pakete (also nach dem 4-maligen Aufruf von send sollten die beiden Queues folgendermaßen aussehen:


sender = deque([])
empfaenger = deque([1, 2, 3, 4])

Wie lautet der Befehl ein Datenpaket von der Sendequeue zur Empfängerqueue zu schicken?



Der del Ausdruck

Allgemeines

Die List-Methode remove(x) löscht nur das erste Vorkommen des Listen-Elements x. Es gibt jedoch mit dem del-Ausdruck (del steht für delete (löschen)) die Möglichkeit, Elemente mit ihrem Index aus einer Liste zu löschen. Dabei ist der del-Ausdruck umfangreicher, da er auch Slices einer Liste oder selbst den gesamten Inhalt einer Liste löschen kann. Hier ein Beispiel dazu:

In [20]:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
del a[0]
print(a)
del a[2:4]
print(a)
del a[:]
print(a)
[2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 3, 6, 7, 8, 9, 10]
[]

Löschen von Variablen

Der del-Ausdruck kann auch zum Löschen von Variablen benutzt werden, diese sind anschliessend nicht mehr verfügbar und die Verwendung dieser Variablen führt dann zu einem Fehler.

In [21]:
del a
In [22]:
print(a)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-22-c5a4f3535135> in <module>()
----> 1 print(a)

NameError: name 'a' is not defined
In [23]:
%%Mooc Video
Out[23]:

Weitere Literatur

In [24]:
%%Mooc WebReference

More on Lists

https://docs.python.org/3/tutorial/datastructures.html#more-on-lists

Hinweis: erweiterte Betrachtung von Listen

In [25]:
%%Mooc WebReference
In [26]:
%%Mooc WebReference

Wikipedia: Erweiterte Backus-Naur-Form

https://de.wikipedia.org/wiki/Erweiterte_Backus-Naur-Form

Hinweis: Beschreibung der erweiterten Backus-Naur-Form