17.3. Comprehensions#

Eine Comprehension ist eine Art von Python-Syntax, die es uns durch eine sehr kompakte Schreibweise erlaubt aus einer Datenstruktur eine andere Datenstruktur zu erstellen.

17.3.1. List-Comprehensions#

Ein Beispiel:

numbers = list(range(10))
squares = [x*x for x in numbers]

print(f'numbers: {numbers}')
print(f'squares: {squares}')
numbers: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
squares: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Wir erzeugen erst eine Liste numbers und transformieren diese in eine neue Liste aus Quadratzahlen. Dieser Code wird durch den Python-Interpreter in folgenden Code übersetzt:

numbers = list(range(10))
squares = []

for x in numbers:
    squares.append(x*x)

print(f'numbers: {numbers}')
print(f'squares: {squares}')
numbers: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
squares: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

x*x ist eine anonyme Funktion in Kurzschreibweise. Wir können dies explizit verdeutlichen:

def square(x):
    return x*x

numbers = list(range(10))
squares = [square(x) for x in numbers]

print(f'numbers: {numbers}')
print(f'squares: {squares}')
numbers: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
squares: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Wir können die Liste der Elemente der Ursprungsliste auch durch eine Fallunterscheidung filter:

def square(x):
    return x*x

numbers = list(range(10))
odd_squares = [square(x) for x in numbers if x % 2 == 1]

print(f'numbers: {numbers}')
print(f'squares: {odd_squares}')
numbers: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
squares: [1, 9, 25, 49, 81]

Wir können auch mehrere Sequenzen kombinieren. Folgender Code

numbers = [i + j for i in range(5) for j in range(2)]
print(f'numbers: {numbers}')
numbers: [0, 1, 1, 2, 2, 3, 3, 4, 4, 5]

entspricht

numbers =[]
for i in range(5):
    for j in range(2):
        numbers.append(i + j)
print(f'numbers: {numbers}')
numbers: [0, 1, 1, 2, 2, 3, 3, 4, 4, 5]

Lassen Sie uns damit eine Matrix \(A\) mit

\[\begin{split} A = \begin{pmatrix} 0+0 & 0+1 & 0+2 & \ldots & 0+(n-1)\\ 1+0 & 1+1 & 1+2 & \ldots & 1+(n-1)\\ \vdots & \vdots & \vdots & \vdots\\ (m-1) + 0 & (m-1) + 1 & (m-1) + 2 & \ldots & (m-1)+(n-1) \end{pmatrix} \end{split}\]

als Liste von Listen generieren:

n = 3
m = 4
A = [[(i+j) for i in range(m)] for j in range(m)]
print(f'Matrix A: {A}')
Matrix A: [[0, 1, 2, 3], [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]

17.3.2. Dictionary-Comprehensions#

Sehr ähnlich lässt sich diese Schreibweise für Wörterbücher einsetzten.

x = {'a': 1, 'b': 2, 'c': 3}

{key:v**3 for (key, v) in x.items()}
{'a': 1, 'b': 8, 'c': 27}

17.3.3. Set-Comprehensions#

Und auch für Mengen können wir Comprehensions verwenden.

numbers = {1,2,3,4}

{x*x for x in numbers}
{1, 4, 9, 16}