Tutorial:Programmieren mit Python/Datenstrukturen: Unterschied zwischen den Versionen
Sn (Diskussion | Beiträge) (Tutorial kopiert) |
Sn (Diskussion | Beiträge) K (Syntaxhighlight) |
||
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
{{../Navigation}} | |||
Aus der [[Visuelle Programmierung|visuellen Programmierung]] kennen wir die ''[[Liste]]'' als [[Datenstruktur]], um eine variable Anzahl semantisch zusammengehöriger Informationen zu speichern. Auch in [[Python (Prgorammiersprache)|Python]] können wir mit Listen arbeiten, darüber hinaus stehen uns aber noch weitere Datenstrukturen zur Verfügung: ''[[Tupel]]'', ''[[Mengen]]'' und ''[[Schlüssel-Wert-Datenstruktur|Wörterbücher]]''. | Aus der [[Visuelle Programmierung|visuellen Programmierung]] kennen wir die ''[[Liste]]'' als [[Datenstruktur]], um eine variable Anzahl semantisch zusammengehöriger Informationen zu speichern. Auch in [[Python (Prgorammiersprache)|Python]] können wir mit Listen arbeiten, darüber hinaus stehen uns aber noch weitere Datenstrukturen zur Verfügung: ''[[Tupel]]'', ''[[Mengen]]'' und ''[[Schlüssel-Wert-Datenstruktur|Wörterbücher]]''. | ||
Zeile 30: | Zeile 30: | ||
|- | |- | ||
|Definition | |Definition | ||
| | |{{Python|a {{=}} [42, True, 'Hello']}} | ||
| | |{{Python|b {{=}} (42, True, 'Hello')}} | ||
| | |{{Python|c {{=}} {42, True, 'Hello'}}} | ||
|- | |- | ||
|Element an Position <math>x</math> abrufen | |Element an Position <math>x</math> abrufen | ||
| | |{{Python|a[x]}} | ||
| | |{{Python|b[x]}} | ||
|nicht möglich, da Mengen keine Reihenfolge haben | |nicht möglich, da Mengen keine Reihenfolge haben | ||
|- | |- | ||
|Größe bestimmen | |Größe bestimmen | ||
| | |{{Python|len(a)}} | ||
| | |{{Python|len(b)}} | ||
| | |{{Python|len(c)}} | ||
|- | |- | ||
|Element hinzufügen | |Element hinzufügen | ||
| | |{{Python|a.append(3.141)}} | ||
|nicht möglich, da die Länge von Tupeln beschränkt ist | |nicht möglich, da die Länge von Tupeln beschränkt ist | ||
| | |{{Python|c.add(3.141)}}, hat keine Auswirkung, wenn das Element schon vorher in der Menge enthalten war. | ||
|- | |- | ||
|Prüfen, ob <math>x</math> enthalten ist | |Prüfen, ob <math>x</math> enthalten ist | ||
| | |{{Python|x in a}} | ||
| | |{{Python|x in b}} | ||
| | |{{Python|x in c}} | ||
|} | |} | ||
Zeile 62: | Zeile 62: | ||
# der Abstand zwischen den Elementen der Teilliste | # der Abstand zwischen den Elementen der Teilliste | ||
Notiert werden diese Indizes durch Doppelpunkte getrennt in eckigen Klammern hinter dem Namen der Liste, also | Notiert werden diese Indizes durch Doppelpunkte getrennt in eckigen Klammern hinter dem Namen der Liste, also {{Python|Liste[Start:Ende:Schritt]}}. | ||
Alle drei Indizes können leer gelassen werden. In diesem Fall werden folgende Standardwerte eingesetzt: | Alle drei Indizes können leer gelassen werden. In diesem Fall werden folgende Standardwerte eingesetzt: | ||
# | # {{Python|0}} für den Beginn | ||
# | # {{Python|len(Liste)}} für das Ende | ||
# | # {{Python|1}} für die Schrittweite | ||
<syntaxhighlight lang="pycon"> | |||
>>> a = [1,2,3,4,5,6,7,8,9,10] | |||
>>> a[3:7] | |||
[4, 5, 6, 7] | |||
>>> a[3:] | |||
[4, 5, 6, 7, 8, 9, 10] | |||
>>> a[:5] | |||
[1, 2, 3, 4, 5] | |||
>>> a[1:7:2] | |||
[2, 4, 6] | |||
>>> a[1::2] | |||
[2, 4, 6, 8, 10] | |||
>>> a[:7:2] | |||
[1, 3, 5, 7] | |||
>>> a[::] | |||
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] | |||
Für alle Indizes können auch negative Werte eingesetzt werden. Dies bedeutet, dass vom Ende der Liste an gezählt wird statt vom Anfang. Ein Start- oder End-Index von | </syntaxhighlight> | ||
Für alle Indizes können auch negative Werte eingesetzt werden. Dies bedeutet, dass vom Ende der Liste an gezählt wird statt vom Anfang. Ein Start- oder End-Index von {{Python|-1}} bezieht sich also auf das letzte Element der Liste. Wenn der Endwert kleiner ist als der Startwert, kann eine negative Schrittweite angegeben, um die Elemente rückwärts aufzuzählen | |||
<syntaxhighlight lang="pycon"> | |||
>>> a[2:-2] | |||
[3, 4, 5, 6, 7, 8] | |||
>>> a[-9:7] | |||
[2, 3, 4, 5, 6, 7] | |||
>>> a[-5:-1] | |||
[6, 7, 8, 9] | |||
>>> a[-5:-1:2] | |||
[6, 8] | |||
>>> a[-1:-7:-2] | |||
[10, 8, 6] | |||
>>> a[7:3] | |||
[] | |||
>>> a[7:3:-1] | |||
[8, 7, 6, 5] | |||
>>> a[::-2] | |||
[10, 8, 6, 4, 2] | |||
</syntaxhighlight> | |||
== Strings als Sonderfall von Listen == | == Strings als Sonderfall von Listen == | ||
[[String (Datentyp)|String]]s werden in vieler Hinsicht wie Listen behandelt und unterstützen einige Listenoperationen, insbesondere Slicing: | [[String (Datentyp)|String]]s werden in vieler Hinsicht wie Listen behandelt und unterstützen einige Listenoperationen, insbesondere Slicing: | ||
<syntaxhighlight lang="pycon"> | |||
>>> b = 'Panamakanal' | |||
>>> b[5] | |||
'a' | |||
>>> b[1::2] | |||
'aaaaa' | |||
>>> b[::-1] | |||
'lanakamanaP' | |||
>>> 'e' in b | |||
False | |||
>>> 'n' in b | |||
True | |||
>>> len(b) | |||
11 | |||
</syntaxhighlight> | |||
Anders als Listen können Strings aber nicht verändert werden: | Anders als Listen können Strings aber nicht verändert werden: | ||
<syntaxhighlight lang="pycon"> | |||
>>> a[2] = 0 | |||
>>> a | |||
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10] | |||
>>> a.append(11) | |||
>>> a | |||
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10, 11] | |||
>>> b[1] = 'e' | |||
Traceback (most recent call last): | |||
File "<stdin>", line 1, in <module> | |||
TypeError: 'str' object does not support item assignment | |||
>>> b.append('?') | |||
Traceback (most recent call last): | |||
File "<stdin>", line 1, in <module> | |||
AttributeError: 'str' object has no attribute 'append' | |||
</syntaxhighlight> | |||
== Exkurs: Wörterbücher == | == Exkurs: Wörterbücher == | ||
Wörterbücher, englisch ''dictionaries'', sind eine Schlüssel-Wert-Datenstruktur, d.h. die Daten werden in Paaren von einem Schlüssel und einem dazugehörigen Wert abgelegt. Mithilfe des Schlüssels kann der Wert dann effizient gefunden werden. | Wörterbücher, englisch ''dictionaries'', sind eine [[Schlüssel-Wert-Datenstruktur]], d.h. die Daten werden in Paaren von einem Schlüssel und einem dazugehörigen Wert abgelegt. Mithilfe des Schlüssels kann der Wert dann effizient gefunden werden. | ||
<syntaxhighlight lang="pycon"> | |||
>>> englischvokabeln = {'cat': 'Katze', 'dog': 'Hund', 'mouse': 'Maus'} | |||
>>> englischvokabeln | |||
{'cat': 'Katze', 'dog': 'Hund', 'mouse': 'Maus'} | |||
</syntaxhighlight> | |||
Es gibt zwei Möglichkeiten, einen Wert mithilfe eines Schlüssels aus einem Wörterbuch abzufragen: | Es gibt zwei Möglichkeiten, einen Wert mithilfe eines Schlüssels aus einem Wörterbuch abzufragen: | ||
[[File:Dictionary Missing Key.jpeg|thumb|rechts|Nicht alle Programmiersprachen erzeugen eine Fehlermeldung, wenn man einen nicht vorhandenen Schlüssel abfragt. In [[JavaScript]] ist das kein Problem.]] | [[File:Dictionary Missing Key.jpeg|thumb|rechts|Nicht alle Programmiersprachen erzeugen eine Fehlermeldung, wenn man einen nicht vorhandenen Schlüssel abfragt. In [[JavaScript]] ist das kein Problem.]] | ||
# Man setzt den Schlüssel wie einen Listen-Index in eckige Klammern; dies führt zu einer Fehlermeldung, wenn man einen nicht vorhandenen Schlüssel abfragt:<syntaxhighlight lang=" | # Man setzt den Schlüssel wie einen Listen-Index in eckige Klammern; dies führt zu einer Fehlermeldung, wenn man einen nicht vorhandenen Schlüssel abfragt: | ||
<syntaxhighlight lang="pycon"> | |||
>>> englischvokabeln['cat'] | >>> englischvokabeln['cat'] | ||
'Katze' | 'Katze' | ||
Zeile 151: | Zeile 161: | ||
File "<stdin>", line 1, in <module> | File "<stdin>", line 1, in <module> | ||
KeyError: 'duck'</syntaxhighlight> | KeyError: 'duck'</syntaxhighlight> | ||
# Man verwendet die | # Man verwendet die {{Python|get}}-Methode; die Abfrage eines nicht vorhandenen Schlüssels sorgt dann dafür, dass ein Standardwert zurückgegeben wird, den man optional ebenfalls angeben kann: | ||
<syntaxhighlight lang="pycon"> | |||
>>> englischvokabeln.get('dog') | >>> englischvokabeln.get('dog') | ||
'Hund' | 'Hund' | ||
Zeile 160: | Zeile 171: | ||
'Das weiß ich nicht' | 'Das weiß ich nicht' | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Mit den Methoden | Mit den Methoden {{Python|keys}}, {{Python|values}} und {{Python|items}} können die Schlüssel, Werte und Schlüssel-Wert-Paare des Wörterbuches in Form von Listen ausgewertet werden: | ||
<syntaxhighlight lang="pycon"> | |||
>>> englischvokabeln.keys() | |||
dict_keys(['cat', 'dog', 'mouse']) | |||
>>> englischvokabeln.values() | |||
dict_values(['Katze', 'Hund', 'Maus']) | |||
>>> englischvokabeln.items() | |||
dict_items([('cat', 'Katze'), ('dog', 'Hund'), ('mouse', 'Maus')]) | |||
</syntaxhighlight> |
Aktuelle Version vom 7. Oktober 2024, 09:13 Uhr
Aus der visuellen Programmierung kennen wir die Liste als Datenstruktur, um eine variable Anzahl semantisch zusammengehöriger Informationen zu speichern. Auch in Python können wir mit Listen arbeiten, darüber hinaus stehen uns aber noch weitere Datenstrukturen zur Verfügung: Tupel, Mengen und Wörterbücher.
Die grundlegenden Eigenschaften und Unterschiede zwischen den anderen drei Datenstrukturen sollen hier kurz zusammengefasst werden:
Eigenschaft/Funktionalität | Liste | Tupel | Menge |
---|---|---|---|
Anzahl Elemente | variabel | fest | variabel |
Elemente dürfen mehrmals vorkommen | ja | ja | nein |
Elemente dürfen verändert werden | ja | nein | nein |
Reihenfolge der Elemente | fest | fest | beliebig |
Definition | a = [42, True, 'Hello']
|
b = (42, True, 'Hello')
|
c = {42, True, 'Hello' }
|
Element an Position abrufen | a[x]
|
b[x]
|
nicht möglich, da Mengen keine Reihenfolge haben |
Größe bestimmen | len(a)
|
len(b)
|
len(c)
|
Element hinzufügen | a.append(3.141)
|
nicht möglich, da die Länge von Tupeln beschränkt ist | c.add(3.141) , hat keine Auswirkung, wenn das Element schon vorher in der Menge enthalten war.
|
Prüfen, ob enthalten ist | x in a
|
x in b
|
x in c
|
Slicing
Python gestattet nicht nur den Zugriff auf einzelne Elemente einer Liste, sondern ermöglicht auch unkompliziert das Erstellen von Teillisten, das so genannte Slicing. Dafür können bis zu drei Indizes angegeben werden:
- der Beginn der Teilliste
- das erste Element, das nicht mehr Teil der Teilliste sein soll
- der Abstand zwischen den Elementen der Teilliste
Notiert werden diese Indizes durch Doppelpunkte getrennt in eckigen Klammern hinter dem Namen der Liste, also Liste[Start:Ende:Schritt]
.
Alle drei Indizes können leer gelassen werden. In diesem Fall werden folgende Standardwerte eingesetzt:
0
für den Beginnlen(Liste)
für das Ende1
für die Schrittweite
>>> a = [1,2,3,4,5,6,7,8,9,10]
>>> a[3:7]
[4, 5, 6, 7]
>>> a[3:]
[4, 5, 6, 7, 8, 9, 10]
>>> a[:5]
[1, 2, 3, 4, 5]
>>> a[1:7:2]
[2, 4, 6]
>>> a[1::2]
[2, 4, 6, 8, 10]
>>> a[:7:2]
[1, 3, 5, 7]
>>> a[::]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Für alle Indizes können auch negative Werte eingesetzt werden. Dies bedeutet, dass vom Ende der Liste an gezählt wird statt vom Anfang. Ein Start- oder End-Index von -1
bezieht sich also auf das letzte Element der Liste. Wenn der Endwert kleiner ist als der Startwert, kann eine negative Schrittweite angegeben, um die Elemente rückwärts aufzuzählen
>>> a[2:-2]
[3, 4, 5, 6, 7, 8]
>>> a[-9:7]
[2, 3, 4, 5, 6, 7]
>>> a[-5:-1]
[6, 7, 8, 9]
>>> a[-5:-1:2]
[6, 8]
>>> a[-1:-7:-2]
[10, 8, 6]
>>> a[7:3]
[]
>>> a[7:3:-1]
[8, 7, 6, 5]
>>> a[::-2]
[10, 8, 6, 4, 2]
Strings als Sonderfall von Listen
Strings werden in vieler Hinsicht wie Listen behandelt und unterstützen einige Listenoperationen, insbesondere Slicing:
>>> b = 'Panamakanal'
>>> b[5]
'a'
>>> b[1::2]
'aaaaa'
>>> b[::-1]
'lanakamanaP'
>>> 'e' in b
False
>>> 'n' in b
True
>>> len(b)
11
Anders als Listen können Strings aber nicht verändert werden:
>>> a[2] = 0
>>> a
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10]
>>> a.append(11)
>>> a
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10, 11]
>>> b[1] = 'e'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
>>> b.append('?')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'append'
Exkurs: Wörterbücher
Wörterbücher, englisch dictionaries, sind eine Schlüssel-Wert-Datenstruktur, d.h. die Daten werden in Paaren von einem Schlüssel und einem dazugehörigen Wert abgelegt. Mithilfe des Schlüssels kann der Wert dann effizient gefunden werden.
>>> englischvokabeln = {'cat': 'Katze', 'dog': 'Hund', 'mouse': 'Maus'}
>>> englischvokabeln
{'cat': 'Katze', 'dog': 'Hund', 'mouse': 'Maus'}
Es gibt zwei Möglichkeiten, einen Wert mithilfe eines Schlüssels aus einem Wörterbuch abzufragen:
- Man setzt den Schlüssel wie einen Listen-Index in eckige Klammern; dies führt zu einer Fehlermeldung, wenn man einen nicht vorhandenen Schlüssel abfragt:
>>> englischvokabeln['cat']
'Katze'
>>> englischvokabeln['dog']
'Hund'
>>> englischvokabeln['duck']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'duck'
- Man verwendet die
get
-Methode; die Abfrage eines nicht vorhandenen Schlüssels sorgt dann dafür, dass ein Standardwert zurückgegeben wird, den man optional ebenfalls angeben kann:
>>> englischvokabeln.get('dog')
'Hund'
>>> englischvokabeln.get('duck')
>>> englischvokabeln.get('dog', 'Das weiß ich nicht')
'Hund'
>>> englischvokabeln.get('duck', 'Das weiß ich nicht')
'Das weiß ich nicht'
Mit den Methoden keys
, values
und items
können die Schlüssel, Werte und Schlüssel-Wert-Paare des Wörterbuches in Form von Listen ausgewertet werden:
>>> englischvokabeln.keys()
dict_keys(['cat', 'dog', 'mouse'])
>>> englischvokabeln.values()
dict_values(['Katze', 'Hund', 'Maus'])
>>> englischvokabeln.items()
dict_items([('cat', 'Katze'), ('dog', 'Hund'), ('mouse', 'Maus')])