En python, je sais comment supprimer des éléments d'une liste.
item_list = ['item', 5, 'foo', 3.14, True]
item_list.remove('item')
item_list.remove(5)
Ce code ci-dessus supprime les valeurs 5 et 'item' de item_list. Mais quand il y a beaucoup de choses à supprimer, je dois écrire plusieurs lignes de
item_list.remove("something_to_remove")
Si je connais l'index de ce que je supprime, j'utilise:
del item_list[x]
où x est l'index de l'élément que je souhaite supprimer.
Si je connais l'index de tous les nombres que je veux supprimer, j'utiliserai une sorte de boucle vers del
les éléments aux index.
Mais que faire si je ne connais pas les indices des éléments que je souhaite supprimer?
J'ai essayé item_list.remove('item', 'foo')
, mais j'ai eu une erreur disant que cela remove
ne prend qu'un seul argument.
Existe-t-il un moyen de supprimer plusieurs éléments d'une liste dans une seule instruction?
PS j'ai utilisé del
et remove
. Quelqu'un peut-il expliquer la différence entre ces deux éléments ou sont-ils identiques?
Merci
del
supprime un élément par son index. Laremove
fonction d'une liste trouve l'index d'un élément, puis appelledel
cet index.Réponses:
En Python, créer un nouvel objet est souvent mieux que de modifier un existant:
Ce qui équivaut à:
Dans le cas d'une grande liste de valeurs filtrées (ici,
('item', 5)
est un petit ensemble d'éléments), utiliser aset
peut conduire à une amélioration des performances, car l'in
opération est en O (1):Notez que, comme expliqué dans les commentaires et suggéré ici , ce qui suit pourrait gagner encore plus de temps, évitant que l'ensemble ne soit construit à chaque boucle:
Un filtre de bloom est également une bonne solution si la mémoire n'est pas bon marché.
la source
in
fonctionnement. Voir ces benchmarks pour des comparaisons des quatre structures de données primitives. Oui, l'ensemble est construit à chaque boucle, comme suggéré ici , par conséquent, enregistrer l'ensemble dans une variable dédiée à utiliser dans l'expression du générateur peut gagner du temps.id(item_list)
avant et aprèsitem_list = [e for e in item_list if e not in ('item', 5)]
. Vérifiez ma réponse pour voir comment modifier une liste en place.la liste finale après la suppression devrait être comme suit
Code sur une seule ligne
la sortie serait la suivante
la source
Je ne sais pas pourquoi tout le monde a oublié de mentionner l'incroyable capacité de
set
s en python. Vous pouvez simplement convertir votre liste en un ensemble, puis supprimer tout ce que vous souhaitez supprimer dans une expression simple comme celle-ci:la source
Je republie ma réponse d' ici parce que j'ai vu qu'elle s'inscrit également ici. Il permet de supprimer plusieurs valeurs ou de supprimer uniquement les doublons de ces valeurs et renvoie une nouvelle liste ou modifie la liste donnée en place.
Extension Docstring:
Vous devez être clair sur ce que vous voulez vraiment faire, modifier une liste existante ou créer une nouvelle liste avec les éléments spécifiques manquants. Il est important de faire cette distinction au cas où vous auriez une deuxième référence pointant vers la liste existante. Si vous avez, par exemple ...
Cela peut être le comportement souhaité ou non.
la source
Vous pouvez utiliser filterfalse fonction à partir itertools Module
Exemple
Production:
la source
Je ne comprends pas exactement pourquoi vous n'aimez pas .remove mais pour obtenir le premier index correspondant à une valeur utilisez .index (value):
puis supprimez la valeur correspondante:
.index (valeur) obtient la première occurrence de valeur et .remove (valeur) supprime la première occurrence de valeur
la source
del item_list[ind]
au lieu depop
si vous n'avez pas besoin de la valeur de résultat.Vous pouvez utiliser ceci -
Supposons que nous ayons une liste,
l = [1,2,3,4,5]
Nous voulons supprimer les deux derniers éléments d'une seule instruction
Nous avons la sortie:
Rester simple
la source