Vorlesungsskript 25

Iterieren wie ein Boss

Im letzten Vorlesungsskript haben Sie gelernt, wie Sie mit Hilfe von Generator-Funktionen und Comprehensions elegant Python-Ausdrücke schreiben können, die Iterables zurückgeben. In diesem Skript werden drei nützliche Funktionen und Methoden vorgestellt, die Python bereits enthält und die ebenfalls Iterables zurückgeben.

Iterieren über Dictionarys: items

Oft muss man über ein Dictionary iterieren und dabei sowohl auf die Schlüssel als auch auf die zugehörigen Werte zugreifen. Erinnern wir uns zum Beispiel an das Ausgeben eines Dictionarys, das als Schlüssel Wörter enthält und als Werte die Häufigkeiten dieser Wörter in einem Text:

for word in frequencies:
   print('Das Wort "{}" kommt {}-mal vor.'.format(word, frequencies[word])

Dictionarys haben die Methode items, die den Inhalt des Dictionarys als ein Iterable zurückgeben, wobei jedes Element ein Tupel (key, value) ist – immer ein Schlüssel zusammen mit dem zugeordneten Wert. So erhalten wir beides auf einmal und können obige Schleife noch etwas eleganter schreiben:

for word, frequency in frequencies.items():
   print('Das Wort "{}" kommt {}-mal vor.'.format(word, frequency))

Iterieren mit Index: enumerate

Beim Iterieren über Listen mussten wir uns bisher entscheiden: Iterieren wir über die Indizes (0, 1, 2…) oder über die Elemente? Mit der eingebauten Funktion enumerate können wir beides haben: Sie nimmt ein Input-Iterable und gibt ein Output-Iterable zurück, dessen Elemente nicht einfach die Elemente des Input-Iterables sind, sondern Tupel (index, element), wobei element ein Element des Input-Iterable ist und index eine laufende Nummer. Zum Beispiel:

>>> for i, word in enumerate(['Google', 'bought', 'YouTube']):
...    print('Word #{}: {}'.format(i, word))
...
Word #0: Google
Word #1: bought
Word #2: YouTube

Iterieren über mehrere Iterables hintereinander: itertools.chain

Die Funktion chain im Modul itertools erlaubt es, mit einer einzigen for-Schleife (oder Comprehension) über mehrere Iterables hintereinander zu iterieren, ohne ineffizienterweise eine große Liste mit allen Elementen machen zu müssen. Zum Beispiel:

>>> import itertools
>>> a = [2, 3, 5]
>>> b = [7, 11]
>>> for number in itertools.chain(a, b):
...    print(number)
...
2
3
5
7
11

Weiterführende Lektüre