Eine Liste, welche einfach eine Reihe von Zahlen oder Texten enthält, ist eine eindimensionale Liste. Aus der Mathematik kennen wir auch Matrizen, oder Tabellen. Diese bestehen aus Zeilen und Spalten, haben also zwei Dimensionen.
Das kann man in Python auch machen. Man muss dazu für jede Zeile eine Liste erzeugen und dann diese Listen als Elemente in einer weiteren Liste speichern. So entsteht eine Liste von Listen.
# Eine Liste
[
[1, 2, 3], # Zeile
[4, 5, 6], # Zeile
[7, 8, 9], # Zeile
]
# oder äquivalent in einer Zeile dargestellt
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Man kann in Python auch zwei- oder gar n-dimensionale Listen haben. Für Python ist das nichts anderes, als eine Liste, deren Elemente wiederum Listen sind.
Für jede zusätzlich Dimension wird eine weitere Verschachtelungsstufe hinzugefügt. Bei zwei Dimensionen kann man auf diese Weise in Python Matrizen, bzw. Tabellen mit mehreren Zeilen und Spalten darstellen.
3 x 3 Matrix
Eine Matrix ist eine Liste von Listen
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix)
Zugriff [][]
Auf einzelne Element in der Matrix zugreifen
# kann auch auf einer Zeile geschrieben werden:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# 1. Zeile ändern - zugewiesener Wert muss eine Liste sein
matrix[0] = [11, 12, 13]
# 3. Wert in 2. Zeile verändern
matrix[1][2] = 0
# Werte ausgeben
print('Matrix:', matrix)
print('Erste Zeile:', matrix[0])
print('Zeile 2, Spalte 3:', matrix[1][2])
print('Zeile 3, Spalte 1:', matrix[2][0])
Schleife über Zeilen
Schleife über einzelne Zeilen Zeilen sind wieder Listen
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for zeile in matrix:
print(zeile)
pprint()
Schreiben Sie eine Funktion pprint
(Abkürzung für Pretty Print
), welche eine 2D-Liste übersichtlich ausgibt:
pprint([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# Ausgabe bspw.
# [
# [1, 2, 3],
# [4, 5, 6],
# [7, 8, 9],
# ]
def pprint(mat2d):
print(mat2d)
pprint([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
pprint([[1, 2, 3, 4], [5, 6, 7, 8], [9, 8, 7, 6]])
Über Funktionen...
Funktionen werden in Python mit dem Schlüsselwort def
definiert.
def pretty_print(matrix2d):
# \__________/ \_______/
# Fkt. Name Parameter
# die Parameter können im Funktionskörper (der eingerückte Teil) verwendet werden
print(matrix2d)
Durch alle Elemente Iterieren
Dazu wird eine verschachtelte Schleife über Zeilen und Spalten verwendet.
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for zeile in matrix:
for zahl in zeile:
print(zahl)
Oder man greift über die Zeilen- (i
) und Spaltenindices (j
) auf die Elemente zu:
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for i in range(3):
for j in range(3):
print(f'[i: {i}, j: {j}] =', matrix[i][j])
Obiges Beispiel funktioniert nur für eine 3x3
Matrix. Ändern Sie das Programm so ab, dass es für beliebige zweidimensionale Listen funktioniert. Probieren Sie Ihre Lösung, indem Sie die unterschiedlichen matrix
Variablen einkommentieren...
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [9, 9, 9], [1, 8, 7]]
# matrix = [[1, 2, 3, 4, 5],[4, 5, 6, 5, 4], [7, 8, 9, 9, 9], [9, 9, 9, 8, 7]]
# matrix = [[1, 2], [4, 5], [6, 7], [8, 9], [10, 11]]
for i in range(3):
for j in range(3):
print(f'[i: {i}, j: {j}] =', matrix[i][j])
Hinweis
Die Länge einer Liste kann mit len
abgefragt werden:
print(len([2, 3, 5]))
create_from.py
Ändern Sie den untenstehenden Code so ab, dass die Variabe matrix
eine Matrix mit der gegebenen Anzahl Zeilen- und Spalten sowie überall den Zellenwerten ZAHL
enthält. Schreiben Sie das Programm so, dass es auch bei geänderten ZEILEN
. SPALTEN
und ZAHL
en Werten funktioniert.
ZEILEN = 3
SPALTEN = 4
ZAHL = 1
matrix = []
print(matrix) # => [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
Hinweis
-
Es braucht eine doppelte Schleife, wobei in der ersten Schleife eine leere Zeilen-Liste erzeugt wird, welche dann in der zweiten (verschachtelten) Schleife mit den Zahlen gefüllt wird.
diag.py
Erstellen Sie ein Programm, welches eine SIZE x SIZE
-Matrix, die in der Diagonalen von Oben-Links nach Unten-Rechts 1
en enthält und sonst mit 0
en gefüllt ist. Probieren Sie Ihr Programm auch mit anderen Werten für SIZE
aus.
SIZE = 4
matrix = []
# => [
# [1, 0, 0, 0],
# [0, 1, 0, 0],
# [0, 0, 1, 0],
# [0, 0, 0, 1],
# ]
SIZE = 4
matrix = []
print(matrix)
Dateiname
EF-Informatik/docs/python/referenzen.md
a = [1, 2, 3]
b = a
b[1] = 5
print('Liste a: ', a)
print('Liste b: ', b)
Wie erklären Sie sich dieses Verhalten?
Lesen Sie den Abschnitt 👉 Assignment (=) in Python (The Copy Module in Python brauchen Sie nicht zu lesen).
Können Sie damit auch folgendes Phänomen erklären?
matrix = []
zeile = [0, 1, 0]
for i in range(3):
matrix.append(zeile)
print(matrix)
matrix[1][1] = 0 # nur den Wert in Zeile 1 in der Mitte auf 0 Setzen
print(matrix)
Fassen Sie obiges Verhalten nun in eigene Worte im Dokument EF-Informatik/docs/python/referenzen.md.
Exotisches (und oft Grund für Fehler):
-
Innere Listen sind unterschiedlich lang durch
-
Anhängen eines weiteren Elementes
-
Anhängen einer weiteren Zeile mit unterschiedlicher Länge
-
...
-
-
Einfügen eines String (oder irgend etwas anderes) in die äussere oder innere Liste
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
matrix[1].append(13)
matrix.append([31])
matrix.insert(2, 'blabla')
for zeile in matrix:
print(zeile)
Zweidimensionale Listen