2016-04-01 111 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]