2016-04-01 19 views
6

Pythonのリストにオブジェクトを削除する方法:今、私はから削除したい私は、次のよう<code>point</code>という名前のクラスを作成し

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) 

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

をしてpointインスタンスのリストを作成しますリストインスタンスは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オブジェクトではありません。 –

+1

あなたの '__cmp__'定義は私には見えません。ブール値ではなく整数を返すことになっています。 – Kevin

答えて

8

あなた__cmp__機能が正しくないと動作しません。 __cmp__は、2番目の要素がselfより小さいか等しいかどうかによって、-1/0/+1を返す必要があります。したがって、__cmp__が呼び出されると、要素が等しい場合はTrueが返され、1と解釈され、したがって「より大きい」と解釈されます。要素が等しくない場合は、False、つまり0を返します。これは「等しい」と解釈されます)。

2次元の点では、「より大きい」および「より小さい」はあまり明確に定義されていません。同じ実装を使用して__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

2つの注釈:最初に '__ne__'も定義しないと、'!= 'は依然としてアイデンティティ比較を使用します。第2に、 '__eq__'のような特別なメソッドは、他のオペランドがメソッドが扱うように設計された型でないときには、' NotImplemented'を返すことが一般的に好まれます。 – user2357112

+0

ありがとうございます。あなたのソリューションは正常に動作します。 –

0

rは、あなたがポイントの新しいインスタンスを作成しますp_listにある場合は、あなたがチェックしている場合は、ポイントのため、そのインスタンスはそれがメモリ内の別の場所を持っている(リストに表示されなくなります)。

この関数は、xとyは1ですポイント削除するために動作します:

for idx, p in enumerate(p_list): 
    if p.x==1 and p.y==1: 
     del p_list[idx] 
関連する問題