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.

4voto

user545424 Points 3707

Voici une autre méthode qui supprime les éléments en place. aussi si votre liste est vraiment longue, elle est plus rapide.

>>> a = range(10)
>>> remove = [0,4,5]
>>> from collections import deque
>>> deque((list.pop(a, i) for i in sorted(remove, reverse=True)), maxlen=0)

>>> timeit.timeit('[i for j, i in enumerate(a) if j not in remove]', setup='import random;remove=[random.randrange(100000) for i in range(100)]; a = range(100000)', number=1)
0.1704120635986328

>>> timeit.timeit('deque((list.pop(a, i) for i in sorted(remove, reverse=True)), maxlen=0)', setup='from collections import deque;import random;remove=[random.randrange(100000) for i in range(100)]; a = range(100000)', number=1)
0.004853963851928711

4voto

Veedrac Points 11712

Cela a été mentionné, mais personne n'a réussi à le faire correctement.

Sur O(n) La solution serait :

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

C'est très proche de La version de SilentGhost mais ajoute deux accolades.

2voto

luca Points 21

La méthode de suppression entraîne un déplacement important des éléments de la liste. Je pense qu'il est préférable de faire une copie :

...
new_list = []
for el in obj.my_list:
   if condition_is_true(el):
      new_list.append(el)
del obj.my_list
obj.my_list = new_list
...

2voto

David Brilliant Points 48

Techniquement, la réponse est NON, il n'est pas possible de supprimer deux objets EN MÊME TEMPS. Cependant, il est possible de supprimer deux objets en une seule ligne de python.

del (foo['bar'],foo['baz'])

supprimera de manière récusée foo['bar'] entonces foo['baz']

2voto

user3149904 Points 97

Nous pouvons le faire en utilisant une boucle for itérant sur les index après avoir trié la liste des index par ordre décroissant.

mylist=[66.25, 333, 1, 4, 6, 7, 8, 56, 8769, 65]
indexes = 4,6
indexes = sorted(indexes, reverse=True)
for i in index:
    mylist.pop(i)
print mylist

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