2016-04-01 69 views
6

我创建了一个名为point类如下:如何删除对象的Python列表

class point: 
    def __init__(self): 
     self.x = 0 
     self.y = 0 

,创造point实例的列表:

p1 = point() 
p1.x = 1 
p1.y = 1 
p2 = point() 
p2.x = 2 
p2.y = 2 
p_list = [] 
p_list.append(p1) 
p_list.append(p2) 

现在我想从删除列表x = 1y = 1的实例,我该怎么做?

我尝试添加了point__cmp__方法如下:

class point: 
    def __init__(self): 
     self.x = 0 
     self.y = 0  
    def __cmp__(self, p): 
     return self.x==p.x and self.y==p.y 

但下面的代码不起作用

r = point() 
r.x = 1 
r.y = 1 
if r in p_list: 
    print('correct') 
else: 
    print('wrong') # it will go here 
p_list.remove(r) # it reports 'ValueError: list.remove(x): x not in list' 
+1

我想这是做'r'不是_identical_的项目在你想删除列表。 –

+1

我认为@ OrangeFlash81是正确的。即使p1和r对于x和y具有相同的_values_,它们也不是_same object_。 –

+1

你的'__cmp__'定义对我来说不正确。它应该返回一个整数,而不是布尔值。 – Kevin

回答

8

__cmp__功能是不正确的。根据第二个元素是否小于/等于/大于self__cmp__应返回-1/0/+1。因此,当您调用__cmp__时,如果元素相等,则返回True,然后将其解释为1,因此“大于”。如果元素不相等,则返回False,即0,其被解释为“相等”)。

对于二维点,“大于”和“小于”不是非常明确的定义,无论如何,所以您可以使用相同的实现将__cmp__替换为__eq__。你point类应该是:

class point: 
    def __init__(self, x=0, y=0): 
     self.x = x 
     self.y = y  

    def __eq__(self, p): 
     return self.x==p.x and self.y==p.y 
+2

两个注意事项:首先,如果您还没有定义'__ne__',那么'!='仍然会使用身份比较。其次,当另一个操作数不是该方法设计用来处理的类型时,通常首选'__eq__'等特殊方法返回'NotImplemented'。 – user2357112

+0

谢谢。你的解决方案工作正常 –

0

当你检查,如果rp_list创建点的新实例,因此该点的实例将不会出现在列表中(它在内存中的不同位置)。

此功能删除一个点,x和y是1:

for idx, p in enumerate(p_list): 
    if p.x==1 and p.y==1: 
     del p_list[idx]