Pitone fornisce potenti strutture dati chiamate elenchi, che possono archiviare e manipolare raccolte di elementi. Fornisce inoltre molti modi per creare elenchi/array bidimensionali. Tuttavia è necessario conoscere le differenze tra questi modi perché possono creare complicazioni nel codice che possono essere molto difficili da individuare. In questo articolo esploreremo il modo giusto di utilizzare array/elenchi 2D in Python.
Usare array/elenchi 2D nel modo giusto
L'utilizzo corretto di array/elenchi 2D implica la comprensione della struttura, l'accesso agli elementi e la manipolazione efficiente dei dati in una griglia bidimensionale. Quando si lavora con dati strutturati o griglie, possono essere utili array o elenchi 2D. Un array 2D è essenzialmente un elenco di elenchi, che rappresenta una struttura simile a una tabella con righe e colonne.
Creazione di un elenco 1-D
In Python, l'inizializzazione di una raccolta di elementi in una sequenza lineare richiede la creazione di un array 1D, che è un processo fondamentale. Sebbene Python non abbia una struttura dati incorporata chiamata “array 1D”, possiamo utilizzare un elenco che può ottenere la stessa funzionalità. Gli elenchi Python sono dinamici e versatili, il che li rende una scelta eccellente per rappresentare array 1D. Iniziamo esaminando i modi comuni per creare un array 1d di dimensione N inizializzato con 0.
Creazione di elenchi 1D utilizzando metodi naive
Inizializzare e popolare manualmente un elenco senza utilizzare funzionalità o costrutti avanzati in Python è noto come creazione di un elenco 1D utilizzando i metodi Naive.
Serie di fibonacci in Java
Python3
N>=> 5> ar>=> [>0>]>*>N> print>(ar)> |
>
>
Produzione
[0, 0, 0, 0, 0]>
Creazione di elenchi 1D utilizzando la comprensione delle liste
Qui stiamo moltiplicando il numero di righe per l'elenco vuoto e quindi l'intero elenco viene creato con ogni elemento zero.
Python3
N>=> 5> arr>=> [>0> for> i>in> range>(N)]> print>(arr)> |
>
>
Produzione
[0, 0, 0, 0, 0]>
Creazione di un elenco 2D
L'utilizzo corretto di array/elenchi 2D implica la comprensione della struttura, l'accesso agli elementi e la manipolazione efficiente dei dati in una griglia bidimensionale. Padroneggiando l'uso degli array 2D, puoi migliorare significativamente la tua capacità di gestire dati complessi ed eseguire in modo efficiente varie operazioni.
Creazione dell'elenco 2D utilizzando Metodo ingenuo
Qui stiamo moltiplicando il numero di colonne e quindi otteniamo l'elenco 1-D di dimensione pari al numero di colonne e quindi lo moltiplichiamo per il numero di righe che si traduce nella creazione di un elenco 2-D.
pulsante centrale css
Python3
rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr)> |
>
>
Produzione
[[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]]>
Nota: L'utilizzo di questo metodo a volte può causare comportamenti imprevisti. In questo metodo, ogni riga farà riferimento alla stessa colonna. Ciò significa che, anche se aggiorniamo solo un elemento dell'array, aggiornerà la stessa colonna nel nostro array.
Pitone
rows, cols>=> (>5>,>5>)> arr>=> [[>0>]>*>cols]>*>rows> print>(arr,>'before'>)> arr[>0>][>0>]>=> 1> # update only one element> print>(arr,>'after'>)> |
>
>
Produzione
([[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')>
Creazione dell'elenco 1D utilizzando Comprensione delle liste
Qui stiamo fondamentalmente utilizzando il concetto di comprensione delle liste e applicando un ciclo per una lista all'interno di una lista e quindi creando una lista 2-D.
Python3
array in stringa
rows, cols>=> (>5>,>5>)> arr>=> [[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)]> print>(arr)> |
>
>
Produzione
[[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]]>
Creazione dell'elenco 1D utilizzando Elenco vuoto
Qui stiamo aggiungendo zeri come elementi per un numero di colonne volte e quindi aggiungendo questo elenco 1-D nell'elenco di righe vuote e quindi creando l'elenco 2-D.
Python3
arr>=>[]> rows, cols>=>5>,>5> for> i>in> range>(rows):> >col>=> []> >for> j>in> range>(cols):> >col.append(>0>)> >arr.append(col)> print>(arr)> |
>
>
Produzione
[[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]]>
Inizializzazione dell'array 2D
Il codice fornito illustra due diversi approcci per inizializzare un array 2D in Pitone . Innanzitutto, la matricearr>viene inizializzato utilizzando una comprensione di elenco 2D, in cui ogni riga viene creata come[0, 0, 0, 0, 0]>. L'intero array viene creato come un elenco di riferimenti allo stesso elenco interno, con conseguente aliasing. Qualsiasi modifica apportata a un elemento in una riga si rifletterà in tutte le righe. Il codice mostra quindi un altro approccio che utilizza una comprensione di elenchi annidati per creare l'array 2Darr>. Questo metodo evita l'aliasing creando un nuovo elenco per ogni riga, risultando in un array 2D corretto.
cucchiaino contro cucchiaio
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)> |
>
>
Produzione
[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]>
Spiegazione:
Ci aspettiamo che solo il primo elemento della prima riga venga modificato in 1, ma il primo elemento di ogni riga viene modificato in 1 nel metodo 2a. Questo funzionamento peculiare è dovuto al fatto che Python utilizza elenchi superficiali che cercheremo di comprendere.
Nel metodo 1a, Python non crea 5 oggetti interi ma crea solo un oggetto intero e tutti gli indici dell'array arr puntano allo stesso oggetto int come mostrato.

Se assegniamo l'indice 0 a un altro numero intero, ad esempio 1, viene creato un nuovo oggetto intero con il valore 1 e quindi l'indice 0 ora punta a questo nuovo oggetto intero come mostrato di seguito

Allo stesso modo, quando creiamo un array 2d come arr = [[0]*cols]*rows stiamo essenzialmente estendendo l'analogia di cui sopra.
- Viene creato un solo oggetto intero.
- Viene creata una singola lista 1d e tutti i suoi indici puntano allo stesso oggetto int nel punto 1.
- Ora, arr[0], arr[1], arr[2] …. arr[n-1] puntano tutti allo stesso oggetto della lista sopra al punto 2.
La configurazione di cui sopra può essere visualizzata nell'immagine seguente.

Ora cambiamo il primo elemento nella prima riga di arr come arr[0][0] = 1
- arr[0] punta al singolo oggetto della lista che abbiamo creato sopra. (Ricorda che anche arr[1], arr[2] …arr[n-1] puntano tutti allo stesso oggetto della lista).
- L'assegnazione di arr[0][0] creerà un nuovo oggetto int con il valore 1 e arr[0][0] ora punterà a questo nuovo oggetto int. (e così anche arr[1][0], arr [2][0] …arr[n-1][0])
Questo può essere visto chiaramente nell'immagine qui sotto.

Pertanto, quando gli array 2D vengono creati in questo modo, la modifica dei valori in una determinata riga influirà su tutte le righe poiché essenzialmente c'è solo un oggetto intero e un solo oggetto elenco a cui fanno riferimento tutte le righe dell'array.
Come ci si aspetterebbe, è difficile individuare gli errori causati da tale utilizzo di elenchi superficiali. Quindi il modo migliore per dichiarare un array 2d è
Python3
rows, cols>=> (>5>,>5>)> print>([[>0> for> i>in> range>(cols)]>for> j>in> range>(rows)])> |
>
>
Produzione
[[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]]>
Questo metodo crea 5 oggetti elenco separati, a differenza del metodo 2a. Un modo per verificarlo è utilizzare l'operatore 'is' che controlla se i due operandi si riferiscono allo stesso oggetto.
array di ordinamento in Java
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>])> |
>
>
Produzione
False True>