Eliminazione elementi lista

Stefaniscion (1370 points)
4 15 32
asked Oct 18, 2017 in Programmare in Python by Stefaniscion (1,370 points)
closed Oct 18, 2017 by andrea.sterbini

Buonpomeriggio,

Mi stavo chiedendo il miglior modo per eliminare ciclicamente più elementi di una lista, in quanto ho notato che quando vado ad eliminare un elemento (con "del ls[x]") tramite un ciclo for, riscontro problemi, poichè (credo!) il numero di elementi della lista cambia.

in pratica se non prendo contromisure del genere "ogni eliminazione devo portare l'indice del ciclo indietro di uno", mi ritrovo con il bellissimo errore
"IndexError: list assignment index out of range"

Spero di essere stato chiaro =D
Any ideas?

Vi ringrazio in anticipo :3
 

1,080 views
closed with note: answered

2 Answers

Best answer
gianpcr (4620 points)
5 16 34
answered Oct 18, 2017 by gianpcr (4,620 points)
selected Oct 18, 2017 by Stefaniscion
Ciao, si quando elimini un elemento dalla lista in un for ottieni quel tipo di problema. Tuttavia esiste un metodo per evitare questo problema, ovvero quello di eseguire il ciclo for all'inverso, ovvero partendo dall'ultimo elemento della lista. Puoi eseguire un ciclo for inverso specificando un range simile: range(len(lista) - 1, -1, -1). Spero di esserti stato di aiuto :)
AndreaGasparini (18730 points)
6 12 118
answered Oct 18, 2017 by AndreaGasparini (18,730 points)
edited Oct 18, 2017 by AndreaGasparini

Oggi in laboratorio è stata spiegata una soluzione a questo "problema". Tramite range len (range(len(lista) - 1, -1, -1) sulla lista puoi andare a crearti una nuova lista con lo stesso numero di indici ma che devono essere in ordine invertito rispetto all'originale (quindi [6, 5, 4, 3, 2, 1] invece che [1, 2, 3, 4, 5, 6] per esempio), in questo modo quando vai ad eliminare gli elementi non si creano problemi nello scalare gli indici della lista. 

R
Rosslyn (260 points)
0 4 7
commented Oct 20, 2017 by Rosslyn (260 points)
anche io sto impazzendo sull'eliminazione di un elemento all'interno del for, ho provato ad usare ciò che avete scritto, ma a me invece da errore   "list.remove(x): x not in list" . Qualcuno sa da cosa potrebbe dipendere? grazie
AndreaGasparini (18730 points)
6 12 118
commented Oct 20, 2017 by AndreaGasparini (18,730 points)
Io personalmente ho preferito non utilizzare il remove(x), ricordati che cancella solamente il primo valore che trova uguale ad x nella lista. Per cancellare gli elementi io ho utilizzato la funzione "del ls[x]" con x che parte dall'ultima posizione grazie alla lista con indici inversi che abbiamo visto prima.
R
Rosslyn (260 points)
0 4 7
commented Oct 20, 2017 by Rosslyn (260 points)
Grazie per la risposta, avevo provato anche con questo metodo ma mi dava un altro errore... avevo scritto del ls ([a]-1, -1, -1), ho sbagliato sintassi?
AndreaGasparini (18730 points)
6 12 118
commented Oct 21, 2017 by AndreaGasparini (18,730 points)
Sì, (range(len(lista) - 1, -1, -1) devi usarlo in un for per avere gli indici al contrario, poi fare il del sulla lista con l'indice del for.
R
Rosslyn (260 points)
0 4 7
commented Oct 21, 2017 by Rosslyn (260 points)
Grazie ancora per l'aiuto, alla fine ho aggirato il problema in altro modo xD ora il programma funziona, ma non "parla" bene con il grade...mi da questo errore : error-> AssertionError
[70, 330, 293, 154, 128, 113, 178] != [70, 154, 128].... ma prima del return ho fatto un print che mi restituisce i valori di ls e dei numeri primi, e quelli sono giusti...
AndreaGasparini (18730 points)
6 12 118
commented Oct 21, 2017 by AndreaGasparini (18,730 points)
Sei sicuro di aver cancellato gli elementi dalla lista e non di aver creato una nuova lista con solo gli elementi che vuoi far uscire? perché il grader va a controllare sulla lista originale (ls), quindi è lì che devono esserci solo 70, 154 e 128.
R
Rosslyn (260 points)
0 4 7
commented Oct 21, 2017 by Rosslyn (260 points)
Effettivamente ho creato una nuova lista, ma poi l'ho sostituita a quella originale, ls=nuova_lista... pensavo potesse funzionare
AndreaGasparini (18730 points)
6 12 118
commented Oct 21, 2017 by AndreaGasparini (18,730 points)
No, Python funziona in modo un po' diverso per le liste, è stato spiegato a lezione, se vuoi capire meglio magari cerca su Google. In ogni caso la soluzione è cancellare direttamente dalla lista originale.