Corso Python / Liste: aggiungere, modificare, eliminare e ordinare elementi

Una lista Python conserva elementi in ordine e permette di aggiungerli, modificarli e rimuoverli. Distingui sempre un’operazione che cambia la lista originale da una che restituisce una nuova lista: la differenza è particolarmente importante con ordinamento e copie.

Scegliere come aggiungere e rimuovere gli elementi

Una lista si crea con parentesi quadre, come [3500, 8000, 2500]. L’indice iniziale è 0 e puoi assegnare un nuovo valore a una posizione esistente. Può contenere duplicati e tipi diversi; per calcolare un totale, però, mantieni significato e unità coerenti. Una lista di numeri e descrizioni non può essere sommata come una lista di importi.

Obiettivo Codice Comportamento
Aggiungere un elemento in fondo items.append(value) Una lista passata come valore diventa un solo elemento annidato.
Aggiungere più elementi items.extend(values) Aggiunge uno alla volta gli elementi di un iterabile.
Rimuovere per posizione items.pop(index) Restituisce l’elemento rimosso; senza indice usa l’ultimo.
Rimuovere per valore items.remove(value) Rimuove solo la prima corrispondenza; se manca genera un errore.

Per esempio, aggiungere [2, 3] con append a [1] produce [1, [2, 3]], mentre extend produce [1, 2, 3]. Consulta la guida ufficiale ai metodi delle liste per i dettagli delle singole operazioni.

Eseguire modifiche e ordinamenti in un esempio completo

Salva il programma seguente in UTF-8 come lists.py, in una cartella di esercitazione. Esegui python lists.py con l’interprete del progetto selezionato. Fuori dall’ambiente virtuale su macOS o Ubuntu, usa python3 se è il comando dell’interprete scelto. Il programma usa solo funzioni predefinite.

amounts = [3500, 8000, 2500]
amounts.append(1000)
amounts[0] = 4000
removed = amounts.pop()
print(amounts, removed)
print(sorted(amounts))
print(amounts)
amounts.sort()
print(amounts)

Il risultato atteso è:

[4000, 8000, 2500] 1000
[2500, 4000, 8000]
[4000, 8000, 2500]
[2500, 4000, 8000]

Prima viene aggiunto 1000, poi il valore in posizione 0 passa da 3500 a 4000. pop() rimuove l’ultimo elemento e lo conserva in removed, perciò la prima stampa mostra tre importi e il valore 1000 separato. La seconda stampa mostra un nuovo ordine calcolato da sorted(), ma la terza dimostra che amounts non è ancora cambiata. Solo dopo amounts.sort() l’ordine della lista originale è diverso.

Distinguere ordinamento, assegnazione e copia

Operazione Risultato restituito Effetto sull’originale
items.sort() None Ordina la stessa lista.
sorted(items) Una nuova lista Conserva l’ordine originale.

Non scrivere items = items.sort(): la lista viene ordinata, ma poi il nome items viene associato a None. Usa items.sort() da solo per cambiare l’originale oppure assegna il risultato di sorted(items) a un altro nome per mantenere entrambe le versioni.

other = amounts non crea una copia: associa un secondo nome alla stessa lista. Una modifica tramite other sarà quindi visibile anche tramite amounts. Con copied = amounts[:] crei invece una copia superficiale, cioè una nuova lista esterna che contiene riferimenti agli stessi elementi. Evita di chiamare la variabile list o sorted, perché nasconderesti i nomi predefiniti.

Se la lista contiene a sua volta altre liste, la copia superficiale continua a condividere quegli oggetti interni. Cambiare un elemento dentro una lista annidata può dunque comparire in entrambe le versioni; sostituire una posizione della lista esterna no. Anche sorted() non esegue una copia profonda degli elementi. La documentazione sulle copie superficiali e profonde chiarisce questa distinzione.

Controllare liste vuote e modifiche durante un ciclo

Leggere items[0] o chiamare items.pop() quando items è vuota genera IndexError. remove() genera invece ValueError quando il valore richiesto non è presente. Decidi se l’assenza di elementi è un caso normale da gestire o un requisito violato, anziché considerare sempre disponibile una posizione.

Rimuovere elementi dalla stessa lista che stai attraversando può saltare valori: dopo una rimozione gli elementi successivi cambiano indice. Per esempio, provare a eliminare tutti gli 1 da [1, 1, 2] attraversando quella stessa lista può lasciarne uno. Quando serve, attraversa una copia o costruisci una nuova lista con gli elementi da conservare.

  1. Aggiungi uno zero alla lista iniziale del programma. Osserva che, dopo le altre modifiche, l’ordinamento contiene lo zero mentre la somma resta uguale a quella senza zero.
  2. Confronta il numero di elementi oltre al totale: una somma invariata non implica dati identici.
  3. Rimuovi lo zero aggiunto e riesegui il file per ritrovare esattamente il risultato originale.

L’ordine e il contenuto sono proprietà diverse dal valore aggregato. Prima di modificare una lista, scegli quale proprietà vuoi conservare e se le altre parti del programma devono vedere la stessa modifica.