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.

16voto

Nikhil Chelliah Points 3463

En tant que fonction :

def multi_delete(list_, *args):
    indexes = sorted(list(args), reverse=True)
    for index in indexes:
        del list_[index]
    return list_

Runs in n log(n) temps, ce qui devrait en faire la solution correcte la plus rapide à ce jour.

12voto

Richard Levasseur Points 5428

Donc, vous voulez essentiellement supprimer plusieurs éléments en une seule passe ? Dans ce cas, la position du prochain élément à supprimer sera décalée du nombre d'éléments supprimés précédemment.

Notre objectif est de supprimer toutes les voyelles, qui sont précalculées comme étant les indices 1, 4 et 7. Notez qu'il est important que les indices to_delete soient dans l'ordre croissant, sinon cela ne fonctionnera pas.

to_delete = [1, 4, 7]
target = list("hello world")
for offset, index in enumerate(to_delete):
  index -= offset
  del target[index]

Ce serait plus compliqué si vous vouliez supprimer les éléments dans n'importe quel ordre. IMO, le tri to_delete pourrait être plus facile que de comprendre quand vous devez ou ne devez pas soustraire de index .

9voto

Paul Points 41

Je suis un débutant total en Python, et ma programmation pour le moment est pour le moins grossière et sale, mais ma solution était d'utiliser une combinaison des commandes de base que j'ai apprises dans les premiers tutoriels :

some_list = [1,2,3,4,5,6,7,8,10]
rem = [0,5,7]

for i in rem:
    some_list[i] = '!' # mark for deletion

for i in range(0, some_list.count('!')):
    some_list.remove('!') # remove
print some_list

Évidemment, comme il faut choisir un caractère de "marquage pour suppression", cette méthode a ses limites.

Pour ce qui est des performances en fonction de la taille de la liste, je suis sûr que ma solution est sous-optimale. Cependant, elle est simple, ce qui, je l'espère, plaira à d'autres débutants, et fonctionnera dans les cas simples où some_list est d'un format bien connu, par exemple, toujours numérique...

6voto

ToolmakerSteve Points 762

Voici une alternative, qui n'utilise pas enumerate() pour créer des tuples (comme dans la réponse originale de SilentGhost).

Cela me semble plus lisible. (Peut-être que je penserais différemment si j'avais l'habitude d'utiliser enumerate.) ATTENTION : Je n'ai pas testé les performances des deux approches.

# Returns a new list. "lst" is not modified.
def delete_by_indices(lst, indices):
    indices_as_set = set(indices)
    return [ lst[i] for i in xrange(len(lst)) if i not in indices_as_set ]

NOTE : syntaxe Python 2.7. Pour Python 3, xrange => range .

Uso:

lst = [ 11*x for x in xrange(10) ]
somelist = delete_by_indices( lst, [0, 4, 5])

somelist :

[11, 22, 33, 66, 77, 88, 99]

--- BONUS ---

Supprimez plusieurs valeurs d'une liste. C'est-à-dire que nous avons les valeurs que nous voulons supprimer :

# Returns a new list. "lst" is not modified.
def delete__by_values(lst, values):
    values_as_set = set(values)
    return [ x for x in lst if x not in values_as_set ]

Uso:

somelist = delete__by_values( lst, [0, 44, 55] )

somelist :

[11, 22, 33, 66, 77, 88, 99]

Il s'agit de la même réponse que précédemment, mais cette fois-ci nous avons fourni les VALEURS à supprimer. [0, 44, 55] .

5voto

Meow Points 399

Une méthode alternative de compréhension des listes qui utilise des valeurs d'index de liste :

stuff = ['a', 'b', 'c', 'd', 'e', 'f', 'woof']
index = [0, 3, 6]
new = [i for i in stuff if stuff.index(i) not in index]

Cela revient :

['b', 'c', 'e', 'f']

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