Parcourir une liste dans laquelle on veut supprimer des éléments
Bonjour,
Débutant en Python, je cherche un moyen propre de faire ça :
Code:
1 2 3 4
|
for j in range(len(maliste)):
if maliste[j].test()==True :
maliste.remove(maliste[j]) |
Propre, parce que dans la mesure où je vais modifier la taille de ma liste en cours de route, il n'est évidemment pas approprié d'utiliser la taille de cette même liste dans ma boucle for.
Est-ce qu'il existe une astuce toute bête en Python ou dois-je passer par une seconde liste ?
Mes solutions en 4 lignes
Le problème résidant dans le fait que, si on élimine des éléments de la liste, l'index va se trouver vers la fin du parcours de range(len(maliste)) hors de la dimension de la liste raccourcie, provoquant ainsi une erreur
Citation:
IndexError: list index out of range
et non pas dans le fait que range(len(maliste)) verrait la valeur len(maliste)varier en cours d'exécution, ce qui n'a évidemment aucun sens puisque range(len(maliste)) utilise la valeur len(maliste) une seule fois, pour créer la liste stable range(len(maliste)) avant de rentrer dans la boucle,
il suffit de mettre un try except pour traiter le problème:
Code:
1 2 3 4
| for j in range(len(maliste)):
try:
if maliste[j].test(): maliste.remove(maliste[j])
except IndexError: break |
On peut aussi contourner le problème en parcourant la liste de la fin vers le début:
Code:
1 2 3 4
| ranj = range(len(maliste))
ranj.reverse()
for j in ranj:
if maliste[j].test(): maliste.remove(maliste[j]) |
Python, c'est agile et concis !