195 votes

Suppression de plusieurs éléments d'une liste

Est-il possible de supprimer plusieurs éléments d'une liste en même temps ? Si je veux supprimer les éléments aux indices 0 et 2, et que j'essaie quelque chose comme del somelist[0] suivi par del somelist[2] la seconde déclaration supprimera effectivement somelist[3] .

Je suppose que je pourrais toujours supprimer les éléments les plus élevés en premier, mais j'espère qu'il existe une meilleure solution.

214voto

tglaria Points 5278

Pour une raison quelconque, je n'aime aucune des réponses ici. Oui, elles fonctionnent, mais à proprement parler, la plupart d'entre elles ne suppriment pas d'éléments dans une liste, n'est-ce pas ? (Mais faire une copie et ensuite remplacer l'original par la copie éditée).

Pourquoi ne pas d'abord supprimer l'indice le plus élevé ?

Y a-t-il une raison à cela ? Je le ferais simplement :

for i in sorted(indices, reverse=True):
    del somelist[i]

Si vous ne voulez vraiment pas supprimer des éléments à l'envers, alors je pense que vous devriez simplement désincrémenter les valeurs d'indices qui sont plus grandes que le dernier indice supprimé (vous ne pouvez pas vraiment utiliser le même indice puisque vous avez une liste différente) ou utiliser une copie de la liste (ce qui ne serait pas une "suppression" mais un remplacement de l'original par une copie éditée).

Est-ce que je rate quelque chose ici, une raison de ne pas supprimer dans l'ordre inverse ?

136voto

SilentGhost Points 79627

Vous pouvez utiliser enumerate et supprimer les valeurs dont l'indice correspond aux indices que vous voulez supprimer :

indices = 0, 2
somelist = [i for j, i in enumerate(somelist) if j not in indices]

128voto

Greg Hewgill Points 356191

Si vous supprimez plusieurs éléments non adjacents, la méthode que vous décrivez est la meilleure (et oui, assurez-vous de commencer par l'indice le plus élevé).

Si vos éléments sont adjacents, vous pouvez utiliser la syntaxe d'affectation des tranches :

a[2:10] = []

33voto

philE Points 1467

Vous pouvez utiliser numpy.delete comme suit :

import numpy as np
a = ['a', 'l', 3.14, 42, 'u']
I = [0, 2]
np.delete(a, I).tolist()
# Returns: ['l', '42', 'u']

Si cela ne vous dérange pas de vous retrouver avec une numpy à la fin, vous pouvez laisser de côté l'élément .tolist() . Vous devriez également constater des améliorations de vitesse assez importantes, ce qui en fait une solution plus évolutive. Je ne l'ai pas testé, mais numpy sont des codes compilés écrits en C ou en Fortran.

18voto

bobince Points 270740

En tant que spécialisation de la réponse de Greg, vous pouvez même utiliser une syntaxe de tranche étendue, par exemple, si vous voulez supprimer les éléments 0 et 2 :

>>> a= [0, 1, 2, 3, 4]
>>> del a[0:3:2]
>>> a
[1, 3, 4]

Cela ne couvre pas toute sélection arbitraire, bien sûr, mais cela peut certainement fonctionner pour supprimer deux éléments quelconques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X