Zum Hauptinhalt springen

Zweidimensionale Listen

Zweidimensionale Liste
Zweidimensionale Liste@

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)

SSR

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

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]))
SSR
2D-Liste erstellen

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 ZAHLen 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.

SSR
SSR

diag.py

Erstellen Sie ein Programm, welches eine SIZE x SIZE-Matrix, die in der Diagonalen von Oben-Links nach Unten-Rechts 1en enthält und sonst mit 0en 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)
SSR
Was ist denn hier los?

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.

Häufige Fehlerquellen

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)

⭐️ Bilder als Listen darstellen

Bilder können im wesentlichen auch als 2- bzw 3-Dimensionale Listen betrachtet werden. Mit dem Paket 👉 pypng lassen sich einfach Bilder erzeugen.

Paket installieren:

  1. In VS Code Terminal > New Terminal

  2. Eintippen pip3 install pypng

  3. Fertig 🥳

Folgender Code erzeugt nun ein kleines Smiley:

import png # Paket png importieren
smiley = [
[000, 000, 000, 000, 000, 000],
[000, 255, 000, 000, 255, 000],
[000, 000, 000, 000, 000, 000],
[000, 255, 000, 000, 255, 000],
[000, 000, 255, 255, 000, 000],
[000, 000, 000, 000, 000, 000]
]
# Erzeuge ein Graustufen-Bild (0=Schwarz, 255=Weiss)
png.from_array(simley, 'L').save('small_smiley.png')

Probieren Sie es aus!

Graustufen-Bilder

Dateiname

EF-Informatik/exercises/mat-to-png.py

Wie Sie bemerken, ist das entstandene Bild nur 6x6 Pixel gross - es muss entsprechend stark gezoomt werden, um das Smiley zu identifizieren.

Erweitern Sie das Programm so, dass Sie mit einem Zoom-Faktor angeben können, auf wie viele Pixel ein Wert verteilt werden soll.

                ______ ______
Zoom | | |
▢▢ --------> | | |
| | |
‾‾‾‾‾‾ ‾‾‾‾‾‾