Please ignore secret bonuses. Secret tests do NOT award bonus. Max hw grade is 30+2 bonus efficiency

Do you need help?

Notice Board

Eliminazione elementi lista

Stefaniscion (1370 points)
6 15 32
in Programmare in Python by (1.4k points)
closed by

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.7k views
closed with the note: answered

2 Answers

Best answer
gianpcr (4620 points)
5 16 34
by (4.6k points)
selected by
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 (18850 points)
7 12 120
by (18.9k points)
edited by

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)
1 4 7
by (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 (18850 points)
7 12 120
by (18.9k 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)
1 4 7
by (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 (18850 points)
7 12 120
by (18.9k 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)
1 4 7
by (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 (18850 points)
7 12 120
by (18.9k 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)
1 4 7
by (260 points)
Effettivamente ho creato una nuova lista, ma poi l'ho sostituita a quella originale, ls=nuova_lista... pensavo potesse funzionare
AndreaGasparini (18850 points)
7 12 120
by (18.9k 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.