J'essaie de supprimer les nombres pairs d'une liste. Ma sortie finale est [4,8] mais il est censé être vide.
list = [2, 4, 6, 8, 10]
for i in list:
divid = i %2
if divid == 0 :
list.remove(i)
print(list)
5 Réponses :
Vous modifiez la liste au fur et à mesure que vous la parcourez. Imaginez un pointeur se déplaçant le long de la liste. Pour la première itération, l'index est 0 (et i est 2). Vous supprimez la première valeur et revenez au début de la boucle.
L'index est incrémenté (à 1) et i est maintenant la deuxième valeur de la liste (maintenant 6) qui est également supprimée. Notez que 4 est maintenant «derrière» l'index de l'itérateur et ne sera jamais atteint. En continuant le long de la liste, vous supprimerez chaque seconde valeur en laissant [4, 8] .
Quelques conseils. Pour parcourir une liste comme celle-ci, vous pouvez utiliser for i in list [:]: qui copie la liste avant de l'itérer. Évitez également de nommer des variables comme list qui remplacent les types intégrés. Vous causerez des bogues plus tard dans votre code.
Comme d'autres l'ont fait remarquer, vous ne devez pas modifier une liste et la parcourir en même temps. La solution la plus simple est de créer une nouvelle liste avec les modifications requises:
lst = [2, 4, 6, 8, 10] new_lst = [i for i in lst if i % 2 != 0]
Ce qui précède utilise une compréhension de liste pour créer une nouvelle liste avec uniquement les éléments impairs - qui revient à supprimer les éléments pairs de la liste d'origine.
Pourrait simplement utiliser if i% 2 plutôt que la vérification explicite de ! = 0 .
for i in lst:
if i % 2 != 0:
new_lst.append(i)
si vous souhaitez utiliser votre code, vous devez parcourir copie de votre liste d'origine. de votre liste
ce qui se passe dans votre code, vous parcourez les éléments d'une liste dont vous supprimez des éléments. la boucle for continue son itération à partir de l'index sur lequel elle reste. mais si vous supprimez un élément de la liste, vous avez déplacé vos éléments pour idx -1, à cause de cela, il "ignore" certains éléments de votre liste
[]
résultat: p>
list = [2, 4, 6, 8, 10]
for i in list.copy():
divid = i %2
if divid == 0 :
list.remove(i)
print(list)
Ceci est dû au fait que vous supprimez l'élément de la même liste que vous itérez. Utilisez plutôt les fonctions lambda, par exemple:
arr = [2, 4, 6, 8, 10] print(list(filter(lambda x: x % 2, arr)))
. Ce serait la méthode la plus simple pour y parvenir
Vous modifiez la liste au fur et à mesure que vous la parcourez.