Inversione di una Lista in Python

Invertire una lista è un'operazione che si presenta molto spesso in Python. A seconda del fatto che si voglia modificare o meno la lista originale, esistono diversi modi per invertire una lista in Python. In questa lezione vedremo come fare usando:

  • il metodo reverse per le liste;
  • lo slicing;
  • la funzione reversed.

Inversione una lista in Python

Una lista è, come abbiamo visto, una sequenza ordinata di elementi. L'ordine di tali elementi è dato dalla loro posizione all'interno della lista e quindi dall'ordine in cui sono stati inseriti.

Nella lezione precedente abbiamo visto come ordinare gli elementi di una lista in base al loro valore. L'operazione di ordinamento o sorting ha senso se gli elementi possono essere comparati con l'operatore di confronto < tra di loro.

In questa lezione ci concentreremo invece su un'altra operazione molto importante che può essere applicata alle liste: l'inversione degli elementi.

Per intenderci, invertire la lista che segue:

lista = [1, 2, 3, 4, 5]

significa ottenere la lista:

lista_invertita = [5, 4, 3, 2, 1]

In Python esistono sostanzialmente tre modi per invertire una lista. Ognuno di essi ha le proprie caratteristiche e quindi è adatto a situazioni diverse.

Inversione di una lista con il metodo reverse

Il primo modo consiste nell'usare il metodo reverse che è disponibile per le liste. Questo metodo non restituisce alcun valore, ma modifica direttamente la lista su cui viene invocato.

lista = [1, 2, 3, 4, 5]
lista.reverse()
print(lista)

Il risultato sarà:

[5, 4, 3, 2, 1]
Definizione

Metodo reverse per le liste

Il metodo reverse inverte l'ordine di una lista. Il metodo non restituisce alcun valore, ma modifica direttamente la lista su cui viene invocato.

lista.reverse()

Inversione di una lista con lo slicing

Il secondo modo consiste nello sfruttare lo slicing.

Come abbiamo visto nella lezione apposita, lo slicing consente di ottenere una sotto-lista a partire da una lista esistente. La sintassi dello slicing è la seguente:

lista[start:stop:step]

Ora, se non indichiamo nessuno dei tre parametri otteniamo una copia della lista originale:

lista = [1, 2, 3, 4, 5]
copia_lista = lista[::]
print(copia_lista)

Il risultato sarà:

[1, 2, 3, 4, 5]

Possiamo usare soltanto il parametro di step per creare una copia della lista originale dove gli elementi sono presi a passi di step stesso. Ad esempio, volendo prendere solo gli elementi dispari possiamo scrivere:

lista = [1, 2, 3, 4, 5]
lista_dispari = lista[::2]
print(lista_dispari)

Il risultato sarà:

[1, 3, 5]

Lo step può essere anche negativo. In questo caso gli elementi vengono presi in ordine inverso. Questo è proprio quello che ci serve. Per cui, se usiamo solo il parametro step e lo impostiamo a -1 otteniamo una lista invertita:

lista = [1, 2, 3, 4, 5]
lista_invertita = lista[::-1]
print(lista_invertita)

Il risultato sarà:

[5, 4, 3, 2, 1]
Definizione

Inversione di una lista con lo slicing

Lo slicing può essere usato per invertire una lista. Basta non specificare il parametro di inzio e di fine e impostare lo step a -1.

lista_invertita = lista[::-1]

Lo slicing restituisce una nuova lista e non modifica la lista originale.

Inversione di una lista con la funzione reversed

L'ultimo modo per invertire una lista in Python è quello di usare la funzione reversed.

Questa funzione, così come la funzione sorted vista in precedenza, restituisce un oggetto di tipo particolare: un iteratore.

Il concetto di iteratore è molto importante e lo studieremo in dettaglio nelle prossime lezioni. Per il momento basta sapere che si tratta di un oggetto che conosce il modo con cui scorrere una sequenza, come una lista, e che permette di visitare li elementi di questa sequenza uno alla volta.

In pratica, un iteratore non è una copia della lista, ma un oggetto che permette di attraversarla in base ad un ordine che lui stesso stabilisce.

Il vantaggio di un iteratore è che non modifichiamo la lista originale e non creiamo nemmeno una nuova lista. Semplicemente usiamo l'iteratore per visitare gli elementi della lista in ordine inverso.

Chiariamo con un esempio. Supponiamo di avere la lista seguente:

lista = [1, 2, 3, 4, 5]

Per ottenere un iteratore invochiamo la funzione reversed passandogli la lista:

iteratore = reversed(lista)

Adesso possiamo usare un ciclo for per visitare gli elementi dell'iteratore:

for elemento in iteratore:
    print(elemento)

Il risultato sarà:

5
4
3
2
1

Se proviamo a stampare nuovamente la lista otterremo:

[1, 2, 3, 4, 5]

Come si vede, la lista originale non è stata modificata.

Gli iteratori, sebbene potenti, hanno dei limiti. Infatti possono essere scorsi una sola volta. Ad esempio, se proviamo a visitare nuovamente gli elementi dell'iteratore non otteniamo nessun risultato:

for elemento in iteratore:
    print(elemento)

Eseguendo questo ciclo for non otterremo nessun risultato in quanto l'iteratore si è esaurito. L'unico modo che abbiamo per scorrere di nuovo l'iteratore è di crearne uno nuovo.

Definizione

Inversione di una lista con la funzione reversed

La funzione reversed restituisce un iteratore che permette di visitare gli elementi di una lista in ordine inverso.

iteratore = reversed(lista)

Un iteratore può essere scorso con un ciclo for e non può essere scansionato più di una volta.

for e in iteratore:
    # Opera sull'elemento e

In Sintesi

In questa lezione abbiamo esaminato le tre modalità con cui in Python è possibile invertire una lista:

  • Il primo modo consiste nell'usare il metodo reverse per le liste. Questo metodo non restituisce alcun valore, ma modifica direttamente la lista su cui viene invocato;
  • Il secondo modo consiste nello sfruttare lo slicing con step negativo. Lo slicing permette di ottenere una copia della lista originale invertita;
  • Il terzo modo consiste nell'usare la funzione reversed. Questa funzione restituisce un iteratore che permette di visitare gli elementi di una lista in ordine inverso.