web-dev-qa-db-fra.com

Existe-t-il un moyen simple de supprimer un élément de la 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 faire cela?

789
zjm1126

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

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

Notez que 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]
1326
Johannes Charra

Habituellement, Python lève une exception si vous lui dites de faire quelque chose qu'il ne peut pas, vous devrez donc 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 que c'est ce que vous attendez et manipulez correctement.

159
Dave Webb

Tu peux faire

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

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

try:
    a.remove(6)
except:
    pass
73
YOU

Considérer:

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

Pour supprimer toutes les occurrences, vous pouvez utiliser la fonction de filtrage dans python . Par exemple, elle ressemblerait à ceci:

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

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

Pour sortir un des objets, utilisez 

a.remove(2)
49
mathwizurd

Voici comment le faire en place (sans compréhension de liste):

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

Si vous savez quelle valeur supprimer, voici un moyen simple (aussi simple que je puisse le penser):

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

Vous obtiendrez [0, 0, 2, 3, 4]

11
gil

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’ont pas de doublons,

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

est sans erreur.

Souvent, une liste est simplement un conteneur pratique pour les éléments non ordonnés. Des questions se posent pour savoir 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 mon_set d'en haut.

11
GreenAsJade

Comme indiqué par de nombreuses autres réponses, list.remove() fonctionnera, mais jetez une ValueError si l'élément ne figurait pas dans la liste. Avec python 3.4+, il existe une approche intéressante pour gérer cela, en utilisant le suppress contextmanager :

from contextlib import suppress
with suppress(ValueError):
    a.remove('b')
9
Felk

Cet exemple est rapide et supprimera toutes les occurrences d'une valeur de la liste:

a = [1,2,3,1,2,3,4]
while True:
    try:
        a.remove(3)
    except:
        break
print a
>>> [1, 2, 1, 2, 4]
7
Chase Adams

Trouver une valeur dans une liste, puis supprimer cet index (s'il existe) est plus facile en utilisant simplement la méthode remove de list:

>>> a = [1, 2, 3, 4]
>>> try:
...   a.remove(6)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 3, 4]
>>> try:
...   a.remove(3)
... except ValueError:
...   pass
... 
>>> print a
[1, 2, 4]

Si vous faites cela souvent, vous pouvez le résumer dans une fonction:

def remove_if_exists(L, value):
  try:
    L.remove(value)
  except ValueError:
    pass
7
Roger Pate

Si vos éléments sont distincts, une simple différence d'ensemble fera l'affaire.

c = [1,2,3,4,'x',8,6,7,'x',9,'x']
z = list(set(c) - set(['x']))
print z
[1, 2, 3, 4, 6, 7, 8, 9]
6
Pagol

Nous pouvons aussi utiliser .pop:

>>> lst = [23,34,54,45]
>>> remove_element = 23
>>> if remove_element in lst:
...     lst.pop(lst.index(remove_element))
... 
23
>>> lst
[34, 54, 45]
>>> 
3
SuperNova

Disons par exemple, nous voulons supprimer tous les 1 de x. Voici comment je m'y prendrais:

x = [1, 2, 3, 1, 2, 3]

Voici une utilisation pratique de ma méthode:

def Function(List, Unwanted):
    [List.remove(Unwanted) for Item in range(List.count(Unwanted))]
    return List
x = Function(x, 1)
print(x)

Et voici ma méthode en une seule ligne:

[x.remove(1) for Item in range(x.count(1))]
print(x)

Les deux donnent ceci en sortie:

[2, 3, 2, 3, 2, 3]

J'espère que cela t'aides. PS, notez que ceci a été écrit dans la version 3.6.2, vous devrez donc peut-être l’ajuster pour les anciennes versions.

2
Krohnus Melavea

Avec une boucle for et une condition:

def cleaner(seq, value):    
    temp = []                      
    for number in seq:
        if number != value:
            temp.append(number)
    return temp

Et si vous souhaitez en supprimer, mais pas tous:

def cleaner(seq, value, occ):
    temp = []
    for number in seq:
        if number == value and occ:
            occ -= 1
            continue
        else:
            temp.append(number)
    return temp
2
user7970984
 list1=[1,2,3,3,4,5,6,1,3,4,5]
 n=int(input('enter  number'))
 while n in list1:
    list1.remove(n)
 print(list1)
2
Ravikiran D

Écraser la liste en indexant tout, sauf les éléments que vous souhaitez supprimer

>>> s = [5,4,3,2,1]
>>> s[0:2] + s[3:]
[5, 4, 2, 1]
2
kilojoules

en une ligne:

a.remove('b') if 'b' in a else None

parfois utile

1
Andrey Suglobov

Peut-être que vos solutions fonctionnent avec ints, mais cela ne fonctionne pas pour moi avec les dictionnaires.

Dans une main, remove () n'a pas fonctionné pour moi. Mais peut-être que cela fonctionne avec les types de base. Je suppose que le code ci-dessous est également le moyen de supprimer des éléments de la liste d'objets.

D'autre part, "del" n'a pas fonctionné correctement non plus. Dans mon cas, avec Python 3.6: lorsque j'essaie de supprimer un élément d'une liste dans une commande 'pour' bucle avec 'del', python change l'index dans le processus et bucle s'arrête prématurément avant l'heure. Cela ne fonctionne que si vous supprimez élément par élément dans inversé ordre. De cette façon, vous ne modifiez pas l'index de tableau d'éléments en attente lorsque vous le parcourez.

Ensuite, j'ai utilisé:

c = len(list)-1
for element in (reversed(list)):
    if condition(element):
        del list[c]
    c -= 1
print(list)

où 'liste' est comme [{'clé1': valeur1 '}, {' clé2 ': valeur2}, {' clé3 ': valeur3}, ...]

Aussi, vous pouvez faire plus de Pythonic en utilisant énumérer:

for i, element in enumerate(reversed(list)):
    if condition(element):
        del list[(i+1)*-1]
print(list)
1
David Martínez
arr = [1, 1, 3, 4, 5, 2, 4, 3]

# to remove first occurence of that element, suppose 3 in this example
arr.remove(3)

# to remove all occurences of that element, again suppose 3
# use something called list comprehension
new_arr = [element for element in arr if element!=3]

# if you want to delete a position use "pop" function, suppose 
# position 4 
# the pop function also returns a value
removed_element = arr.pop(4)

# u can also use "del" to delete a position
del arr[4]
0
Brijesh Kushwaha

syntaxe: lst.remove(x)

Par exemple:

lst = ['one', 'two', 'three', 'four', 'two']

lst.remove('two') #it will remove first occurence of 'two' in a given list
del lst[2] #delete item by index value

print(lst)
0
Ganesh Kharad

Cela supprime toutes les instances de "-v" du tableau sys.argv et ne se plaint pas si aucune instance n'a été trouvée:

while "-v" in sys.argv:
    sys.argv.remove('-v')

Vous pouvez voir le code en action dans un fichier appelé speechToText.py:

$ python speechToText.py -v
['speechToText.py']

$ python speechToText.py -x
['speechToText.py', '-x']

$ python speechToText.py -v -v
['speechToText.py']

$ python speechToText.py -v -v -x
['speechToText.py', '-x']
0
Mike Slinn