use*_*385 11 python compare list
我认为这应该有效,但它给了我一个错误.我有一个包含类对象的列表node.我有两个不同的清单
当我发现open_list我需要从中删除它的特定节点时node_list.我知道列表中包含存储在其中的对象的地址
所以当我尝试做的时候
removed = open_list.pop(min_index)
node_list.remove(removed)
Run Code Online (Sandbox Code Playgroud)
它给我一个错误的说法
node_list.remove(removed)
ValueError: list.remove(x): x not in list
Run Code Online (Sandbox Code Playgroud)
但列表只包含像指针一样的地址吗?它应匹配相同的地址.我打印出的地址removed和整个node_list(现在只有10项不用担心)打印出来:( node_list中的最后一项与删除的地址匹配:
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>]
Run Code Online (Sandbox Code Playgroud)
谢谢
所以我想检查node_list中是否存在我要删除的节点.当我在http://docs.python.org/tutorial/datastructures.html上查找一些简单的列表函数时
list.index(x)remove.index(x)如果元素不在列表中,则两者都会出错.这导致我的程序停止运行.绕过这个,我可以在以下之前使用这个语句.remove():node in node_list我认为in检查一个元素是否是列表的一部分并返回一个bool.只是仔细检查谢谢,
ins*_*get 12
发生这种情况是因为您理解为识别Node类的两个实例的特征,而不是python如何理解它.
问题出在这里.假设你问python 5==5,python会返回True.这是因为python知道ints.但是,Node是您定义的自定义类,因此您需要在两个Node对象相同时告诉python .由于你(可能)没有,python默认比较它们在内存中的位置.由于两个独立的实例将位于两个不同的内存位置,因此python将返回False.如果你熟悉Java可言,这就像之间的区别==和.equals(...)
为了做到这一点,进入你的Node类并定义__eq__(self, other)方法,其中other应该是另一个实例Node.
例如,如果您的节点有一个被调用的属性,name并且两个具有相同名称的节点被认为是相同的,那么您__eq__可能看起来像这样:
def __eq__(self, other):
myName = self.name
hisName = other.name
if myName == hisName:
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
当然,编写相同功能的更优雅方式是:
def __eq__(self, other):
return self.name == other.name
Run Code Online (Sandbox Code Playgroud)
完成后,您的错误应该消失
编辑1:回应帝斯曼的评论
class Node: pass
a = [Node(), Node()]
b = a[:]
b.remove(a.pop(0))
Run Code Online (Sandbox Code Playgroud)
这会奏效.但仔细观察后,很明显a [0]和b [0]实际上是同一个对象.这可以通过调用id(a[0])和比较来验证,id(b[[0])以确认它们确实是相同的
编辑2:回应OP的后续问题(作为编辑添加到原始问题)
是的,列表中不存在的对象将导致错误,该错误通常会停止程序流.这可以通过以下两种方式之一解决:
if x in my_list:
my_list.remove(x)
Run Code Online (Sandbox Code Playgroud)
要么
try:
my_list.remove(x)
except:
pass
Run Code Online (Sandbox Code Playgroud)
第二种方法试图删除x从my_list并且如果在错误的结果,忽略该错误
| 归档时间: |
|
| 查看次数: |
26666 次 |
| 最近记录: |