15. Operationen und Methoden für Sequenzen

Slices

Ein Slice ist ein Ausschnitt aus einer Sequenz:

>>> s = "0123455"
>>> s[1:3]
'12'

Es werden also die Elemente vom ersten Index einschließlich bis zum zweiten Index ausschließlich in eine neue Sequenz des gleichen Typs übernommen.

Es gibt auch offene Slices:

>>> l = ["null", 1, [2], "drei"]
>>> l[-2:]
[[2], 'drei']
>>> l[:3]
['null', 1, [2]]

Bei ihnen wird alles vom ersten Index bis zum Ende der Sequenz in die neue Sequenz geschrieben, oder vom Anfang bis zum zweiten Index ausschließlich.

Man kann sich fragen, warum die Python-MacherInnen sich entschieden haben, das Element mit dem letzten Index nicht mitzunehmen. Es gibt zwei Möglichkeiten, das zu verstehen. Einerseits kann man nur so seq[:4] als “die ersten vier Elemente von seq” lesen (wäre seq[4] im slice, wären es fünf Elemente – zählt nach!). Andererseits gilt nur mit dieser Definition seq = seq[:splitPoint]+seq[splitPoint:].

Operationen auf Sequenzen

Man kann Elemente auf die Zugehörigkeit zu Sequenzen prüfen, die Länge, das Maximum oder Minimum einer Sequenz bestimmen oder Sequenzen verketten:

>>> s = "Ich könnte eine Liste sein"
>>> 'c' in s
1
>>> 'c' not in s
0
>>> s+", oder?"
'Ich k\xf6nnte eine Liste sein, oder?'
>>> len(s)
26
>>> min(s)
' '
>>> max(s)
'\xf6'

Warum hier [xf6 statt eines ö ausgegeben wurde, werden wir später sehen – akzeptiert vorerst, dass Python sich im interaktiven Modus nicht traut, für das System “komische” Zeichen einfach so auszugeben und es eine Repräsentation wählt, bei der nichts (oder wenig) schief gehen kann, dass aber das [xf6 aus Python-Sicht eurem ö exakt entspricht.

Methoden von Sequenzen

Auch Sequenzen haben Methoden – natürlich einige weniger als Strings, die sozusagen ein “Spezialfall” von Sequenzen sind:

>>> "aba".index("a")
0
>>> range(10).index(4)
4
>>> (range(10)*7).count(4)
7

Hier begegnen wir zum ersten Mal flüchtig dem Konzept der Vererbung: Strings können alles, was Sequenzen können (erben also alle Eigenschaften, die Sequenzen haben), können darüber hinaus aber noch erheblich mehr.

Methoden von mutable sequences

Veränderbare Sequenzen haben eine ganze Reihe von Methoden, um sie zu verändern, z.B. Anhängen, Einfügen, Umkehren, Sortieren:

>>> l = ["eine", "Liste"]
>>> l.append("lang");print l
['eine', 'Liste', 'lang']
>>> l.insert(1, "veränderte");print l
['eine', 'ver\xe4nderte', 'Liste', 'lang']
>>> l.reverse(); print l
['lang', 'Liste', 'ver\xe4nderte', 'eine']
>>> l.sort(); print l
['Liste', 'eine', 'lang', 'ver\xe4nderte']

DieseOperationen geben nichts zurück, wir haben die Liste jeweils explizit gedruckt. Grund dafür ist, dass die Liste “in place” verändert wird, also keine neue Liste erzeugt wird.

Zu den Semikola: Man kann in Python mehrere Statements in eine Zeile schreiben und durch Semikola trennen, sollte das aber im Regelfall nicht tun.

Wieder “erben” veränderbare Sequenzen von allgemeinen Sequenzen, erstere können also alles, was letztere können, und noch mehr.

Mehr Methoden von Sequenzen in der Python-Referenz.

Übungen zu diesem Abschnitt

Ihr solltet euch wenigstens an den rötlich unterlegten Aufgaben versuchen

(1)

Macht euch klar, was bei Strings und Listen jeweils Element der Sequenzen ist. Probiert etwa das folgende und erklärt, was jeweils passiert:

>>> "aba".index("a")
>>> ["aba"].index("a")
>>> ["a", "b", "a"].index("a")
>>> ["a", "b", "aba"].count("a")

Denkt euch andere Beispiele mit den hier besprochenen Methoden aus.

Eine Ausnahme hier ist der (bool’sche) in-Operator, der (etwa seit Python 2.0) auf Strings anders operiert als auf andere Sequenzen. Vergleicht

>>> ["a", "b"] in ["a", "b", "c"]
>>> "ab" in "abc"

und erklärt, inwieweit sich in hier anders verhält als die anderen Methoden.

(2)

Übersetzt die folgenden Beschreibungen in slices einer Liste l; dabei wollen wir, um zu große Konfusion zu vermeiden, wie Python zählen, d.h. eine Liste besteht aus dem nullten, ersten, zweiten, dritten usf. Element.

  1. Das vierte und fünfte Element
  2. Das dritte bis einschließlich siebte Element
  3. Alle Elemente ab dem dritten
  4. Alle Elemente bis einschließlich dem vorletzten
  5. Alle Elemente bis auf das nullte
  6. Alle Elemente bis auf das vierte
  7. Alle Elemente bis auf das dritte, vierte und fünfte
  8. Alle Elemente

(3)

Im Unterschied zu den Methoden von Strings, die wir kennen, geben die die Methoden, die Listen verändern, nichts zurück. Warum könnten das die Python-Designer wohl so gemacht haben?

(4)

Wie könnte man die Umkehrung eines Strings bekommen, also zu abc die Umkehrung cab usf? Tipp: Für Listen ist die Umkehrung schon in Python eingebaut


Markus Demleitner

Copyright Notice