Est-il un moyen simple de supprimer un élément de la liste en valeur?
a = [1, 2, 3, 4]
b = a.index(6)
del a[b]
print a
Ci-dessus affiche 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
Alors, je dois faire ceci:
a = [1, 2, 3, 4]
try:
b = a.index(6)
del a[b]
except:
pass
print a
Mais n'est-il pas un moyen plus simple de faire cela?
- Vous le calcul de l'indice de 6 dans votre liste. Mais 6 n'est pas dans votre liste de ... de sorte que ce qui est censé se passer? 🙂
- cela n'a rien à voir avec la suppression d'une valeur dans une liste, étant donné que votre code n'est pas d'atteindre la del déclaration. Vous devriez peut-être changer son nom, ğ comment puis-je obtenir l'index d'une valeur qui n'est pas dans une liste. Réponse évidente - vous ne pouvez pas.
- Eh bien, pas vraiment. Il veut supprimer un élément de la liste, indépendamment de savoir si elle existe ou pas, de ne pas obtenir l'index d'un élément inexistant. La question est bien posée.
InformationsquelleAutor zjm1126 | 2010-05-08
Vous devez vous connecter pour publier un commentaire.
Pour supprimer un élément de la première occurrence dans une liste, il suffit d'utiliser
list.remove
:Esprit qu'il ne fait pas de supprimer toutes les occurrences de votre élément. L'utilisation d'une compréhension de liste pour que.
remove
est-il O(n)?a.removed('b')
, qui s'apparente à la relation entresort
etsorted
.Généralement Python lève une Exception si vous lui dites de faire quelque chose qu'il ne peut pas, de sorte que vous aurez à faire soit:
ou:
Une Exception n'est pas nécessairement une mauvaise chose, tant que c'est celui que vous attendez et de gérer correctement les.
a.remove(c)
peut échouer de toute façon, malgré laif c in a
vérifier (a
susceptibles d'être modifiées dans un autre thread après lec in a
vérifier, mais avant laa.remove(c)
appel).try/except
ou les serrures pourrait être utilisée pour éviter la condition de la course.a.remove(c)
est effectuée. Voir les listes Sont thread-safeVous pouvez faire
mais au-dessus, le besoin de recherche 6 dans la liste a 2 fois, alors essayez l'exception serait plus rapide
Considérer:
De prendre toutes les occurrences, vous pouvez utiliser la fonction de filtre en python.
Par exemple, il pourrait ressembler:
Donc, il serait garder tous les éléments d'un != 2.
Juste à prendre l'un des éléments de
filter()
dans un autrelist()
? Selon le manuel, il retourne déjà une liste.Voici comment le faire en place (sans compréhension de liste):
O(n*n)
inutilement (comparer 1e6 et 1e12 – vous ne voulez pas prendre le risque de la dernière).while 1: L.remove(value)
et le retour surValueError
pourrait bien fonctionner avec un peu devalue
s ou de petites listes Disponible.Si vous connaissez la valeur à supprimer, voici une façon simple (aussi simple que je peux penser, de toute façon):
Vous aurez
[0, 0, 2, 3, 4]
while 1 in a:
que la structure de boucle?O(n^2)
où une compréhension seraitO(n)
.Une autre possibilité est d'utiliser un jeu au lieu d'une liste, si un jeu est applicable dans votre application.
C'est à dire si vos données n'est pas ordonné, et ne pas avoir des doublons, puis
est exempt d'erreur.
Souvent une liste est juste une pratique conteneur pour les éléments qui sont en fait des non-ordonnée. Il y a des questions qui demandent comment faire pour supprimer toutes les occurrences d'un élément dans une liste. Si vous ne voulez pas dupes, en premier lieu, une fois de plus un jeu est à portée de main.
ne change pas my_set à partir de ci-dessus.
Comme indiqué par de nombreux autres réponses,
list.remove()
de travail, mais de jeter unValueError
si l'élément n'est pas dans la liste. Avec python 3.4+, il y a une approche intéressante pour la manipulation, à l'aide de la supprimer contextmanager:Recherche d'une valeur dans une liste, puis de le supprimer de l'index (si elle existe) est plus facile à faire en utilisant simplement la liste supprimer de la méthode:
Si vous le faites souvent, vous pouvez l'envelopper dans une fonction:
Cet exemple est rapide et va supprimer toutes les occurrences d'une valeur dans la liste:
break
surexcept ValueError
.Si vos éléments sont distincts, alors qu'un simple jeu de différence va faire.
en une seule ligne:
parfois il utile
Nous pouvons également l'utiliser .pop:
Remplacer la liste par l'indexation de tout, sauf les éléments que vous souhaitez supprimer
Avec une boucle for et une condition:
Et si vous souhaitez supprimer certains, mais pas tous:
Dire par exemple, nous voulons supprimer toutes les 1 de x. C'est la façon dont j'allais à ce sujet:
Maintenant, c'est une mise en pratique de ma méthode:
Et c'est ma méthode en une seule ligne:
Le rendement de cette sortie:
Espère que cette aide.
PS, moyens noter que ceci a été écrit dans la version 3.6.2, de sorte que vous devrez peut-être ajuster pour les anciennes versions.
Peut-être que vos solutions travaille avec des entiers, mais Il Ne marche pas pour moi avec dictionarys.
Dans une main, remove() n'a pas fonctionné pour moi. Mais peut-être qu'il travaille avec des Types de base. Je suppose que le code soufflet est aussi la façon de supprimer des éléments à partir d'objets de la liste.
Dans l'autre main, 'del' a ne marchait pas non plus. Dans mon cas, à l'aide de python 3.6: lorsque j'essaie de supprimer un élément d'une liste en un "pour" bucle avec 'del' de la commande, python changements de l'indice dans le processus et bucle s'arrête prématurément avant l'heure. Il ne fonctionne que si Vous supprimez l'élément par élément dans inversé commande. De cette façon, vous n'avez pas modifier l'attente d'éléments de tableau d'index lorsque vous allez à travers elle
Puis, Im utilisé:
où "liste" est comme [{'cle1':valeur1'},{'cle2':valeur2}, {'cle3':valeur3}, ...]
Vous pouvez aussi le faire plus pythonic l'aide d'énumérer:
Cette opération supprime toutes les instances de
"-v"
à partir de la matrice desys.argv
, et ne pas se plaindre si pas de cas ont été trouvés:Vous pouvez voir le code en action, dans un fichier appelé
speechToText.py
:syntaxe:
lst.remove(x)
Par exemple:
Oui. C'est ce que j'ai trouvé pour être le plus utile:
Maintenant
.remove()
ne prend qu'un seul argument, de sorte que vous ne pouvez supprimer un nombre entier à partir de votre liste.remove
, de sorte que vous n'ajoutant rien de nouveau là, la seule chose nouvelle, c'est que, sans raison apparente, vous avez apporté danssys.exit()
. En outre, votre méthode se bloque si l'élément cible n'est pas dans la liste, et le but de l'OP, la question était de savoir comment supprimer des éléments sans s'écraser lorsque la méthode a été appliquée à un élément figurant pas dans la liste.