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