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

A=(0+00+10+20+(n1)1+01+11+21+(n1)(m1)+0(m1)+1(m1)+2(m1)+(n1))

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}