logo

Python | 2D-Arrays/Listen richtig nutzen

Python stellt leistungsstarke Datenstrukturen, sogenannte Listen, bereit, mit denen Elementsammlungen gespeichert und bearbeitet werden können. Bietet außerdem viele Möglichkeiten zum Erstellen zweidimensionaler Listen/Arrays. Allerdings muss man die Unterschiede zwischen diesen Methoden kennen, da sie zu Komplikationen im Code führen können, die nur sehr schwer aufzuspüren sind. In diesem Artikel untersuchen wir die richtige Verwendung von 2D-Arrays/-Listen in Python.

2D-Arrays/Listen richtig nutzen

Die richtige Verwendung von 2D-Arrays/-Listen erfordert das Verständnis der Struktur, den Zugriff auf Elemente und die effiziente Bearbeitung von Daten in einem zweidimensionalen Raster. Beim Arbeiten mit strukturierten Daten oder Rastern können 2D-Arrays oder -Listen hilfreich sein. Ein 2D-Array ist im Wesentlichen eine Liste von Listen, die eine tabellenartige Struktur mit Zeilen und Spalten darstellt.



Erstellen einer 1-D-Liste

In Python erfordert die Initialisierung einer Sammlung von Elementen in einer linearen Reihenfolge die Erstellung eines 1D-Arrays, was ein grundlegender Prozess ist. Obwohl Python keine integrierte Datenstruktur namens „1D-Array“ hat, können wir eine Liste verwenden, die die gleiche Funktionalität erreichen kann. Python-Listen sind dynamisch und vielseitig, was sie zu einer hervorragenden Wahl für die Darstellung von 1D-Arrays macht. Schauen wir uns zunächst gängige Methoden zum Erstellen eines 1D-Arrays der Größe N an, das mit Nullen initialisiert wird.

Erstellen einer 1D-Liste mit naiven Methoden

Das manuelle Initialisieren und Auffüllen einer Liste ohne Verwendung erweiterter Funktionen oder Konstrukte in Python wird als Erstellen einer 1D-Liste mit naiven Methoden bezeichnet.

Python3








N>=> 5> ar>=> [>0>]>*>N> print>(ar)>

>

>

Ausgabe

[0, 0, 0, 0, 0]>

Erstellen einer 1D-Liste mithilfe des Listenverständnisses

Hier multiplizieren wir die Anzahl der Zeilen mit der leeren Liste und somit wird die gesamte Liste mit jedem Element Null erstellt.

Python3




N>=> 5> arr>=> [>0> for> i>in> range>(N)]> print>(arr)>

>

>

Ausgabe

[0, 0, 0, 0, 0]>

Erstellen einer 2D-Liste

Die richtige Verwendung von 2D-Arrays/-Listen erfordert das Verständnis der Struktur, den Zugriff auf Elemente und die effiziente Bearbeitung von Daten in einem zweidimensionalen Raster. Durch die Beherrschung der Verwendung von 2D-Arrays können Sie Ihre Fähigkeit, komplexe Daten zu verarbeiten und verschiedene Vorgänge effizient auszuführen, erheblich verbessern.

Erstellen einer 2D-Liste mit Naive Methode

Hier multiplizieren wir die Anzahl der Spalten und erhalten so eine 1-D-Liste mit einer Größe, die der Anzahl der Spalten entspricht, und multiplizieren sie dann mit der Anzahl der Zeilen, was zur Erstellung einer 2-D-Liste führt.

Python3




rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr)>

>

>

Ausgabe

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Notiz: Die Verwendung dieser Methode kann manchmal zu unerwartetem Verhalten führen. Bei dieser Methode verweist jede Zeile auf dieselbe Spalte. Das heißt, selbst wenn wir nur ein Element des Arrays aktualisieren, wird dieselbe Spalte in unserem Array aktualisiert.

Python




rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr,>'before'>)> arr[>0>][>0>]>=> 1> # update only one element> print>(arr,>'after'>)>

>

>

Ausgabe

([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]], 'before') ([[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]], 'after')>

Erstellen einer 1D-Liste mit Listenverständnis

Hier verwenden wir grundsätzlich das Konzept des Listenverständnisses und wenden eine Schleife für eine Liste innerhalb einer Liste an und erstellen so eine 2D-Liste.

Python3




rows, cols>=> (>5>,>5>)> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> print>(arr)>

>

>

Ausgabe

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Erstellen einer 1D-Liste mit Leere Liste

Hier hängen wir Nullen als Elemente für mehrere Spalten an und hängen dann diese 1-D-Liste an die leere Zeilenliste an und erstellen so die 2-D-Liste.

Python3

js globale Variable




arr>=>[]> rows, cols>=>5>,>5> for> i>in> range>(rows):> >col>=> []> >for> j>in> range>(cols):> >col.append(>0>)> >arr.append(col)> print>(arr)>

>

>

Ausgabe

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Initialisierung des 2D-Arrays

Der bereitgestellte Code demonstriert zwei verschiedene Ansätze zum Initialisieren eines 2D-Arrays in Python . Zuerst das Arrayarr>wird mit einem 2D-Listenverständnis initialisiert, wobei jede Zeile als erstellt wird[0, 0, 0, 0, 0]>. Das gesamte Array wird als Liste von Verweisen auf dieselbe innere Liste erstellt, was zu Aliasing führt. Jede an einem Element in einer Zeile vorgenommene Änderung wird in allen Zeilen widergespiegelt. Der Code zeigt dann einen anderen Ansatz, bei dem ein verschachteltes Listenverständnis zum Erstellen des 2D-Arrays verwendet wirdarr>. Diese Methode vermeidet Aliasing, indem für jede Zeile eine neue Liste erstellt wird, was zu einem richtigen 2D-Array führt.

Python3




# Python 3 program to demonstrate working> # of method 1 and method 2.> rows, cols>=> (>5>,>5>)> # method 2 1st approach> arr>=> [[>0>]>*>cols]>*>rows> # lets change the first element of the> # first row to 1 and print the array> arr[>0>][>0>]>=> 1> for> row>in> arr:> >print>(row)> # method 2 2nd approach> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> # again in this new array lets change> # the first element of the first row> # to 1 and print the array> arr[>0>][>0>]>=> 1> for> row>in> arr:> >print>(row)>

>

>

Ausgabe

[1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [1, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0] [0, 0, 0, 0, 0]>

Erläuterung:

Wir erwarten, dass sich nur das erste Element der ersten Zeile in 1 ändert, aber das erste Element jeder Zeile wird in Methode 2a in 1 geändert. Diese eigenartige Funktionsweise liegt daran, dass Python flache Listen verwendet, die wir zu verstehen versuchen werden.
In Methode 1a erstellt Python keine 5 Integer-Objekte, sondern nur ein Integer-Objekt, und alle Indizes des Arrays arr zeigen auf dasselbe int-Objekt, wie gezeigt.

Wenn wir den 0. Index einer anderen Ganzzahl, beispielsweise 1, zuweisen, wird ein neues Ganzzahlobjekt mit dem Wert 1 erstellt und dann zeigt der 0. Index nun auf dieses neue int-Objekt, wie unten gezeigt

Wenn wir ein 2D-Array als arr = [[0]*cols]*rows erstellen, erweitern wir im Wesentlichen die obige Analogie.

  1. Es wird nur ein ganzzahliges Objekt erstellt.
  2. Eine einzelne 1D-Liste wird erstellt und alle ihre Indizes verweisen auf dasselbe int-Objekt in Punkt 1.
  3. Nun, arr[0], arr[1], arr[2] …. arr[n-1] verweisen alle auf dasselbe Listenobjekt oben in Punkt 2.

Der obige Aufbau kann im Bild unten visualisiert werden.

Jetzt ändern wir das erste Element in der ersten Zeile von arr als arr[0][0] = 1

  • arr[0] zeigt auf das einzelne Listenobjekt, das wir oben erstellt haben. (Denken Sie daran, dass arr[1], arr[2] …arr[n-1] alle auch auf dasselbe Listenobjekt verweisen.)
  • Durch die Zuweisung von arr[0][0] wird ein neues int-Objekt mit dem Wert 1 erstellt und arr[0][0] zeigt nun auf dieses neue int-Objekt.(und das gilt auch für arr[1][0], arr [2][0] … arr[n-1][0])

Dies ist im folgenden Bild deutlich zu erkennen.

Wenn also 2D-Arrays auf diese Weise erstellt werden, wirkt sich die Änderung der Werte in einer bestimmten Zeile auf alle Zeilen aus, da es im Wesentlichen nur ein ganzzahliges Objekt und nur ein Listenobjekt gibt, auf das alle Zeilen des Arrays verweisen.

Wie zu erwarten ist, ist es schwierig, Fehler aufzuspüren, die durch die Verwendung flacher Listen verursacht werden. Daher ist die bessere Möglichkeit, ein 2D-Array zu deklarieren

Python3




rows, cols>=> (>5>,>5>)> print>([[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)])>

>

>

Ausgabe

[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]>

Diese Methode erstellt im Gegensatz zu Methode 2a fünf separate Listenobjekte. Eine Möglichkeit, dies zu überprüfen, ist die Verwendung des „is“-Operators, der prüft, ob sich die beiden Operanden auf dasselbe Objekt beziehen.

Python3




rows, cols>=> (>5>,>5>)> # method 2 2nd approach> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> # check if arr[0] and arr[1] refer to> # the same object> print>(arr[>0>]>is> arr[>1>])># prints False> # method 2 1st approach> arr>=> [[>0>]>*>cols]>*>rows> # check if arr[0] and arr[1] refer to the same object prints True because there is only one> #list object being created.> print>(arr[>0>]>is> arr[>1>])>

>

>

Ausgabe

False True>