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

Aus KGS-Wiki
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
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


  >>> a = [1,2,3,4,5,6,7,8,9,10]
  >>> a = [1,2,3,4,5,6,7,8,9,10]
Zeile 85: Zeile 85:
  >>> 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
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
  >>> a[2:-2]
  >>> a[2:-2]
  [3, 4, 5, 6, 7, 8]
  [3, 4, 5, 6, 7, 8]
Zeile 151: Zeile 151:
   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="text">
>>> englischvokabeln.get('dog')
>>> englischvokabeln.get('dog')
'Hund'
'Hund'
Zeile 160: Zeile 160:
'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()
  >>> englischvokabeln.keys()
  dict_keys(['cat', 'dog', 'mouse'])
  dict_keys(['cat', 'dog', 'mouse'])

Version vom 5. August 2024, 22:31 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'
    
  2. 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')])