Question Existe-t-il un moyen simple de supprimer un élément de liste par valeur?


a=[1,2,3,4]
b=a.index(6)
del a[b]
print a

Ce qui précède montre l'erreur suivante:

Traceback (most recent call last):
  File "D:\zjm_code\a.py", line 6, in <module>
    b=a.index(6)
ValueError: list.index(x): x not in list

Donc je dois faire ceci:

a=[1,2,3,4]
try:
    b=a.index(6)
    del a[b]
except:
    pass
print a

Mais n'y a-t-il pas un moyen plus simple de le faire?


655
2018-05-08 07:48


origine


Réponses:


Pour supprimer la première occurrence d'un élément dans une liste, il suffit d'utiliser list.remove:

>>> a = ['a', 'b', 'c', 'd']
>>> a.remove('b')
>>> print a
['a', 'c', 'd']

Attention, cela ne supprime pas toutes les occurrences de votre élément. Utilisez une compréhension de liste pour cela.

>>> a = [10, 20, 30, 40, 20, 30, 40, 20, 70, 20]
>>> a = [x for x in a if x != 20]
>>> print a
[10, 30, 40, 30, 40, 70]

1131
2018-05-08 07:56



Habituellement, Python lancera une exception si vous lui dites de faire quelque chose qu'il ne peut pas faire, donc vous devrez faire soit:

if c in a:
    a.remove(c)

ou:

try:
    a.remove(c)
except ValueError:
    pass

Une Exception n'est pas nécessairement une mauvaise chose tant qu'elle est attendue et gérée correctement.


139
2018-05-08 08:02



Tu peux faire

a=[1,2,3,4]
if 6 in a:
    a.remove(6)

mais ci-dessus besoin de rechercher 6 dans la liste un 2 fois, alors essayez, sauf serait plus rapide

try:
    a.remove(6)
except:
    pass

68
2018-05-08 07:57



Considérer:

a = [1,2,2,3,4,5]

Pour supprimer toutes les occurrences, vous pouvez utiliser la fonction de filtre en python. Par exemple, cela ressemblerait à:

a = list(filter(lambda x: x!= 2, a))

Donc, il garderait tous les éléments d'un! = 2.

Pour simplement prendre l'un des articles utiliser

a.remove(2)

39
2017-08-11 19:55



Voici comment le faire inplace (sans compréhension de la liste):

def remove_all(seq, value):
    pos = 0
    for item in seq:
        if item != value:
           seq[pos] = item
           pos += 1
    del seq[pos:]

13
2018-05-08 14:57



Si vous savez quelle valeur supprimer, voici un moyen simple (aussi simple que je puisse penser, de toute façon):

a = [0, 1, 1, 0, 1, 2, 1, 3, 1, 4]
while a.count(1) > 0:
    a.remove(1)

Tu auras [0, 0, 2, 3, 4]


11
2018-03-28 21:20



Une autre possibilité consiste à utiliser un ensemble au lieu d'une liste, si un ensemble est applicable dans votre application.

IE si vos données ne sont pas commandées, et n'a pas de doublons, alors

my_set=set([3,4,2])
my_set.discard(1)

est sans erreur.

Souvent, une liste est juste un conteneur pratique pour les articles qui sont réellement non ordonnés. Il y a des questions demandant comment supprimer toutes les occurrences d'un élément d'une liste. Si vous ne voulez pas de dupes en premier lieu, encore une fois un ensemble est pratique.

my_set.add(3)

ne change pas my_set d'en haut.


8
2018-03-01 23:13