List-Comprehensions (A)

9.3.1. List-Comprehensions (A)#

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]]