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
Je dois donc 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?
except
est une mauvaise pratique . Utilisezexcept Exception
au minimum.Réponses:
Pour supprimer la première occurrence d'un élément dans une liste, utilisez simplement
list.remove
:Gardez à l'esprit qu'il ne supprime pas toutes les occurrences de votre élément. Utilisez une liste de compréhension pour cela.
la source
remove
est-ce O (n)?Habituellement, Python lèvera une exception si vous lui dites de faire quelque chose qu'il ne peut pas, vous devrez donc faire soit:
ou:
Une exception n'est pas nécessairement une mauvaise chose tant qu'elle est attendue et gérée correctement.
la source
a.remove(c)
peut quand même échouer malgré laif c in a
vérification (a
pourrait être modifiée dans un autre thread après lac in a
vérification mais avant l'a.remove(c)
appel).try/except
ou des serrures pourraient être utilisées pour éviter les conditions de course.Tu peux faire
mais ci-dessus, il faut rechercher 6 dans la liste 2 fois, alors essayez sauf, ce serait plus rapide
la source
Considérer:
Pour supprimer toutes les occurrences, vous pouvez utiliser la fonction de filtrage en python. Par exemple, cela ressemblerait à:
Ainsi, il conserverait tous les éléments de
a != 2
.Pour retirer simplement l'un des objets, utilisez
la source
filter()
un autrelist()
? Selon le manuel, il renvoie déjà une liste.Voici comment le faire sur place (sans compréhension de la liste):
la source
O(n*n)
inutilement (comparez 1e6 et 1e12 - vous ne voulez pas risquer ce dernier).while 1: L.remove(value)
et le retourValueError
pourrait bien fonctionner avec quelquesvalue
s ou petites listes dans CPython.Si vous savez quelle valeur supprimer, voici un moyen simple (aussi simple que je puisse penser, de toute façon):
Tu auras
[0, 0, 2, 3, 4]
la source
while 1 in a:
comme structure de boucle?O(n^2)
là que serait une compréhensionO(n)
.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 ne contiennent pas de doublons, alors
est sans erreur.
Souvent, une liste n'est qu'un conteneur pratique pour les articles qui ne sont en fait pas classés. Il y a des questions qui demandent comment supprimer toutes les occurrences d'un élément d'une liste. Si vous ne voulez pas de dupes en premier lieu, une fois de plus, un ensemble est pratique.
ne change pas mon_ensemble d'en haut.
la source
Comme indiqué par de nombreuses autres réponses,
list.remove()
fonctionnera, mais lancez unValueError
si l'élément n'était pas dans la liste. Avec python 3.4+, il existe une approche intéressante pour gérer cela, en utilisant le gestionnaire de contexte de suppression :la source
Il est plus facile de trouver une valeur dans une liste, puis de supprimer cet index (s'il existe) en utilisant simplement la méthode de suppression de la liste:
Si vous le faites souvent, vous pouvez le récapituler dans une fonction:
la source
Cet exemple est rapide et supprimera toutes les instances d'une valeur de la liste:
la source
break
le faireexcept ValueError
.En une seule ligne:
parfois c'est utile.
Encore plus simple:
la source
Si vos éléments sont distincts, une simple différence d'ensemble fera l'affaire.
la source
Nous pouvons également utiliser .pop:
la source
Écraser la liste en indexant tout sauf les éléments que vous souhaitez supprimer
la source
Avec une boucle for et une condition:
Et si vous souhaitez supprimer certains, mais pas tous:
la source
la source
Disons par exemple que nous voulons supprimer tous les 1 de x. Voici comment je procéderais:
Maintenant, ceci est une utilisation pratique de ma méthode:
Et voici ma méthode en une seule ligne:
Les deux produisent ceci en sortie:
J'espère que cela t'aides. PS, veuillez noter que cela a été écrit dans la version 3.6.2, vous devrez donc peut-être l'ajuster pour les anciennes versions.
la source
Peut-être que vos solutions fonctionnent avec des ints, mais cela ne fonctionne pas pour moi avec des dictionnaires.
D'une part, 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.
En revanche, «del» n'a pas fonctionné correctement non plus. Dans mon cas, en utilisant python 3.6: lorsque j'essaie de supprimer un élément d'une liste dans une commande 'for' bucle avec 'del', python modifie 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 l' ordre inverse . De cette façon, vous ne modifiez pas l'index du tableau des éléments en attente lorsque vous le parcourez
Ensuite, je l'ai utilisé:
où 'list' est comme [{'key1': value1 '}, {' key2 ': value2}, {' key3 ': value3}, ...]
Vous pouvez également faire plus de pythonic en utilisant énumérer:
la source
la source
Cela supprime toutes les instances de
"-v"
du tableausys.argv
et ne se plaint pas si aucune instance n'a été trouvée:Vous pouvez voir le code en action, dans un fichier appelé
speechToText.py
:la source
c'est ma réponse, utilisez simplement pendant et pour
la source