Tutorial:Programmieren mit Python/Datenstrukturen: Unterschied zwischen den Versionen

Aus KGS-Wiki
Keine Bearbeitungszusammenfassung
K (Syntaxhighlight)
 
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt)
Zeile 30: Zeile 30:
|-
|-
|Definition
|Definition
|<code>a&nbsp;=&nbsp;[42,&nbsp;True,&nbsp;'Hello']</code>
|{{Python|a {{=}} [42, True, 'Hello']}}
|<code>b&nbsp;=&nbsp;(42,&nbsp;True,&nbsp;'Hello')</code>
|{{Python|b {{=}} (42, True, 'Hello')}}
|<code>c&nbsp;=&nbsp;{42,&nbsp;True,&nbsp;'Hello'}</code>
|{{Python|c {{=}} {42, True, 'Hello'}}}
|-
|-
|Element an Position <math>x</math> abrufen
|Element an Position <math>x</math> abrufen
|<code>a[x]</code>
|{{Python|a[x]}}
|<code>b[x]</code>
|{{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
|<code>len(a)</code>
|{{Python|len(a)}}
|<code>len(b)</code>
|{{Python|len(b)}}
|<code>len(c)</code>
|{{Python|len(c)}}
|-
|-
|Element hinzufügen
|Element hinzufügen
|<code>a.append(3.141)</code>
|{{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
|<code>c.add(3.141)</code>, hat keine Auswirkung, wenn das Element schon vorher in der Menge enthalten war.
|{{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
|<code>x in a</code>
|{{Python|x in a}}
|<code>x in b</code>
|{{Python|x in b}}
|<code>x in c</code>
|{{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 <code>Liste[Start:Ende:Schritt]</code>.
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:


# <code>0</code> für den Beginn
# {{Python|0}} für den Beginn
# <code>len(Liste)</code> für das Ende
# {{Python|len(Liste)}} für das Ende
# <code>1</code> für die Schrittweite
# {{Python|1}} für die Schrittweite
 
<syntaxhighlight lang="pycon">
>>> a = [1,2,3,4,5,6,7,8,9,10]
>>> a = [1,2,3,4,5,6,7,8,9,10]
>>> a[3:7]
>>> a[3:7]
[4, 5, 6, 7]
[4, 5, 6, 7]
>>> a[3:]
>>> a[3:]
[4, 5, 6, 7, 8, 9, 10]
[4, 5, 6, 7, 8, 9, 10]
>>> a[:5]
>>> a[:5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
>>> a[1:7:2]
>>> a[1:7:2]
[2, 4, 6]
[2, 4, 6]
>>> a[1::2]
>>> a[1::2]
[2, 4, 6, 8, 10]
[2, 4, 6, 8, 10]
>>> a[:7:2]
>>> a[:7:2]
[1, 3, 5, 7]
[1, 3, 5, 7]
>>> a[::]
>>> a[::]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[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 <code>-1</code> 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>
>>> a[2:-2]
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
[3, 4, 5, 6, 7, 8]
<syntaxhighlight lang="pycon">
>>> a[-9:7]
>>> a[2:-2]
[2, 3, 4, 5, 6, 7]
[3, 4, 5, 6, 7, 8]
>>> a[-5:-1]
>>> a[-9:7]
[6, 7, 8, 9]
[2, 3, 4, 5, 6, 7]
>>> a[-5:-1:2]
>>> a[-5:-1]
[6, 8]
[6, 7, 8, 9]
>>> a[-1:-7:-2]
>>> a[-5:-1:2]
[10, 8, 6]
[6, 8]
>>> a[7:3]
>>> a[-1:-7:-2]
[]
[10, 8, 6]
>>> a[7:3:-1]
>>> a[7:3]
[8, 7, 6, 5]
[]
>>> a[::-2]
>>> a[7:3:-1]
[10, 8, 6, 4, 2]
[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:
>>> b = 'Panamakanal'
<syntaxhighlight lang="pycon">
>>> b[5]
>>> b = 'Panamakanal'
'a'
>>> b[5]
>>> b[1::2]
'a'
'aaaaa'
>>> b[1::2]
>>> b[::-1]
'aaaaa'
'lanakamanaP'
>>> b[::-1]
>>> 'e' in b
'lanakamanaP'
False
>>> 'e' in b
>>> 'n' in b
False
True
>>> 'n' in b
>>> len(b)
True
11
>>> 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:
>>> a[2] = 0
<syntaxhighlight lang="pycon">
>>> a
>>> a[2] = 0
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10]
>>> a
>>> a.append(11)
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10]
>>> a
>>> a.append(11)
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a
>>> b[1] = 'e'
[1, 2, 0, 4, 5, 6, 7, 8, 9, 10, 11]
Traceback (most recent call last):
>>> b[1] = 'e'
  File "<stdin>", line 1, in <module>
Traceback (most recent call last):
TypeError: 'str' object does not support item assignment
  File "<stdin>", line 1, in <module>
>>> b.append('?')
TypeError: 'str' object does not support item assignment
Traceback (most recent call last):
>>> b.append('?')
  File "<stdin>", line 1, in <module>
Traceback (most recent call last):
AttributeError: 'str' object has no attribute 'append'
  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.
>>> englischvokabeln = {'cat': 'Katze', 'dog': 'Hund', 'mouse': 'Maus'}
 
>>> englischvokabeln
<syntaxhighlight lang="pycon">
{'cat': 'Katze', 'dog': 'Hund', 'mouse': 'Maus'}
>>> 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="text">
# 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 <code>get</code>-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="text">
# 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 <code>keys</code>, <code>values</code> und <code>items</code> können die Schlüssel, Werte und Schlüssel-Wert-Paare des Wörterbuches in Form von Listen ausgewertet werden:
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:
>>> englischvokabeln.keys()
 
dict_keys(['cat', 'dog', 'mouse'])
<syntaxhighlight lang="pycon">
>>> englischvokabeln.values()
>>> englischvokabeln.keys()
dict_values(['Katze', 'Hund', 'Maus'])
dict_keys(['cat', 'dog', 'mouse'])
>>> englischvokabeln.items()
>>> englischvokabeln.values()
dict_items([('cat', 'Katze'), ('dog', 'Hund'), ('mouse', 'Maus')])
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:

  1. der Beginn der Teilliste
  2. das erste Element, das nicht mehr Teil der Teilliste sein soll
  3. 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:

  1. 0 für den Beginn
  2. len(Liste) für das Ende
  3. 1 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:

Nicht alle Programmiersprachen erzeugen eine Fehlermeldung, wenn man einen nicht vorhandenen Schlüssel abfragt. In JavaScript ist das kein Problem.
  1. 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'
  1. 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')])