supprimer une instance d'un objet dans la liste python
Je Pense que cela devrait fonctionner, mais sa me donne une erreur.
J'ai une liste qui contient les objets de la classe node
. J'ai deux listes différentes
- open_list
- node_list.( ils ne sont pas le même sens de la longueur, de la commande sage)
Quand je trouve un nœud spécifique dans le open_list
j'ai besoin de supprimer à partir de la node_list
. Je sais que les listes ont des adresses pour les objets stockés dans leur
donc, lorsque j'essaie de faire
removed = open_list.pop(min_index)
node_list.remove(removed)
il me donne un message d'erreur indiquant
node_list.remove(removed)
ValueError: list.remove(x): x not in list
mais la liste contient les adresses qui agissent comme des pointeurs de droite? il doit correspondre à la même adresse. j'ai imprimé l'adresse de removed
et l'ensemble de la node_list
(seulement 10 éléments pour l'instant, n'ayez pas peur)
impression: l'impression (le dernier élément de node_list correspond à l'adresse d'supprimée:
removed: <__main__.node instance at 0x0124A440>
node_list: [<__main__.node instance at 0x01246E90>, <__main__.node instance at 0x01246EE0>, <__main__.node instance at 0x0124A300>, <__main__.node instance at 0x0124A328>, <__main__.node instance at 0x0124A350>, <__main__.node instance at 0x0124A378>, <__main__.node instance at 0x0124A3A0>, <__main__.node instance at 0x0124A3C8>, <__main__.node instance at 0x0124A3F0>, <__main__.node instance at 0x0124A418>, <__main__.node instance at 0x0124A440>]
Grâce
suivi Q
je tiens donc à vérifier si le nœud que je veux supprimer existe dans le node_list. quand j'ai regardé une simple liste de fonctions sur http://docs.python.org/tutorial/datastructures.html
list.index(x)
et remove.index(x)
à la fois donner une erreur si l'élément n'est pas dans la liste. cela a provoqué mon arrêt du programme en cours d'exécution.
pour contourner cela, puis-je utiliser cette déclaration avant le .remove()
: node in node_list
je pense que le in
vérifie si un élément fait partie d'une liste et renvoie un booléen.
il suffit de double vérification
merci,
source d'informationauteur user1521385
Vous devez vous connecter pour publier un commentaire.
Ce qui se passe parce que vous comprenez que l'identification des caractéristiques de deux instances de votre
Node
classe, n'est pas la façon python comprend.Le problème se trouve ici. Supposons que vous avez demandé python
5==5
python serait de retourTrue
. C'est parce que python saitint
s. Cependant,Node
est une classe personnalisée que vous avez défini, de sorte que vous devez dire à python lorsque deuxNode
objets sont les mêmes. Depuis que vous avez (sans doute) n'ont pas, python par défaut, la comparaison de leurs emplacements dans la mémoire. Depuis deux instances séparées seront dans deux différents emplacements de mémoire, python sera de retourFalse
. Si vous êtes familier avec Java, c'est comme la différence entre==
et.equals(...)
Pour ce faire, allez dans votre
Node
de classe et de définir les__eq__(self, other)
méthode, oùother
devrait être une autre instance deNode
.Par exemple, si votre nœuds ont un attribut appelé
name
et les deux nœuds qui ont le même nom sont les mêmes, votre__eq__
pourrait ressembler à ceci:Bien sûr, la solution la plus élégante façon d'écrire de la même fonction est:
Lorsque cela est fait, votre erreur devrait disparaître
EDIT 1: En réponse à DSM'commentaire
Cela fonctionne. Mais regardant de plus près, il devient évident que a[0] et b[0] sont en fait le même objet. Cela peut être vérifié en appelant
id(a[0])
et en la comparant avecid(b[[0])
pour confirmer qu'ils sont bien de la mêmeEDIT 2: En réponse à la discussion de la question de suivi (ajouté à l'original question que d'éditer)
Oui, l'objet n'existant pas dans la liste, une erreur qui aurait normalement dû arrêter le flux du programme. Ce problème peut être résolu dans l'une des deux façons suivantes:
OU
La deuxième méthode tente de supprimer
x
demy_list
et si cela résulte en une erreur, d'ignorer l'erreurSi j'ai lu la question de droit, python par défaut de comparer les emplacements de mémoire est le comportement qu'il cherche, mais ne reçoit pas. Voici un exemple où une classe personnalisée est définie
Node
c'est montrer qu'il n'est pas nécessaire pour le__eq__(self, other)
.Je ne peux pas être sûr, parce que vous n'avez pas de montrer où votre
open_node_list
etnode_list
ont été définies, mais je soupçonne que les listes elles-mêmes font référence au même objet de la liste. Si c'est le cas, le poppingopen_node_list
également pop denode_list
par conséquent, le nœud n'existe plus lorsque vous appelezremove
. Ici est un exemple dans lequelnode_list
etopen_node_list
sont vraiment de la même liste et donc des modifications à l'un affecte l'autre:Une façon, vous pouvez copiez une liste est:
En réponse à votre suivi, oui
in
permettra de vérifier l'appartenance à une liste, de sorte que:ne vous donnera pas l'erreur. Sinon, vous pouvez intercepter l'erreur: