2017-06-16 5 views
0
class Shape(): 
    def __init__(self, n_sides, name): 
     self.n_sides = n_sides 
     self.name = name 

def generate_shapes(): 
    return [Shape(4, 'square'), Shape(3, 'triangle'), Shape(4, 'rectangle')] 

def generate_one_shape(): 
    return Shape(4, 'square') 

shapes = generate_shapes() 
one_shape = generate_one_shape() 

shapes.index(one_shape) 

list.index()はオブジェクトを表面的に比較するので、次のようなエラーが発生します。オブジェクトの状態の等価性に基づいてリスト内のオブジェクトのインデックスを取得します。

Traceback (most recent call last): 
    File "list_remove_object_by_value.py", line 14, in <module> 
    shapes.index(one_shape) 
ValueError: <__main__.Shape instance at 0x7efffbbcec68> is not in list 

がどのように私はそれを有するクラスの形の別のインスタンスを使用して効率的にリスト内のクラスShapeのインスタンスのインデックスを取得することができますように私は、インデックスを返すためにlist.index(one_shape)を希望属性の値は?

+1

Shapeに '__eq__'を定義してみてください – Hamms

+0

*複数の*要素がある場合や* none *の場合はどうなりますか? –

+0

このようなインスタンスが複数ある場合は、リストの最初の要素のインデックスのみが必要です。 –

答えて

1

__eq__メソッドを定義するだけです。

class Shape(): 
    def __init__(self, n_sides, name): 
     self.n_sides = n_sides 
     self.name = name 

    def __eq__(self, other): 
     return (
      isinstance(other, type(self)) and 
      other.n_sides == self.n_sides and 
      other.name == self.name 
     ) 

inindexのような何演算子は、それぞれ他の項目==のいずれかどうかを確認します。この__eq__メソッドは、==が2つのオブジェクトと共に呼び出されたときの動作を定義します。デフォルトでは、オブジェクトがまったく同じオブジェクトかどうかを確認しますが、両方がShapeであるかどうかをチェックし、同じn_sidesおよびnameを持っているかどうかをチェックします。

+1

あなたがそれをしている間は、 '__ne__'と' __hash__'を指定するか、ハッシュ可能でなければオブジェクトをハッシュできないように '__hash__ = None'を設定するべきです。 (Python 3はこれを自動的に処理しますが、Python 2はしばらく死ぬことはありません) – user2357112

+0

クラス属性の1つが浮動小数点数の場合でもこれは動作しますか? –

+0

@AdityaBarve彼らは正確に同等でなければなりません。一般的なトリックは 'float_a == float_b'の代わりに、 '0.01(浮動小数点数 - 浮動小数点数)<0.01'を使用して、丸め誤差を考慮して互いに '0.01'であるかどうかをチェックします。他の番号も選択できます。 – Artyer

関連する問題