9

私はPersonこのようなクラスを持っています:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return '<Person {}>'.format(self.name)

次のように、このクラスのいくつかのインスタンスをセットに追加したいと思います。

tom = Person('tom', 18)
mary = Person('mary', 22)
mary2 = Person('mary2', 22)

person_set = {tom, mary, mary2}
print(person_set)
# output: {<Person tom>, <Person mary>, <Person mary2>}

ご覧のとおり、このセットには 2 つの Mary が含まれています。Person同じ年齢のインスタンスが同一人物と見なされ、セットに 1 回だけ追加されるようにするにはどうすればよいですか?

言い換えれば、どうすれば結果を得ることができ{<Person tom>, <Person mary>}ますか?

4

1 に答える 1

37

新しいオブジェクトが Python セットに追加されると、オブジェクトのハッシュ コードが最初に計算され、次に、同じハッシュ コードを持つ 1 つ以上のオブジェクトが既にセット内にある場合、これらのオブジェクトが新しいオブジェクト。

この結果、クラスに__hash__(...)and__eq__(...)メソッドを実装する必要があります。例えば:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        return self.age == other.age

    def __hash__(self):
        return hash(self.age)

    def __repr__(self):
        return '<Person {}>'.format(self.name)

tom = Person('tom', 18)
mary = Person('mary', 22)
mary2 = Person('mary2', 22)

person_set = {tom, mary, mary2}
print(person_set)
# output: {<Person tom>, <Person mary>}

__hash__ただし、クラスの正しい実装とは何かについて、非常に慎重に検討する__eq__必要があります。上記の例は機能しますが、無意味です (たとえば、 と の両方__hash____eq__年齢に関してのみ定義されているという点で)。

于 2012-05-11T07:57:28.403 に答える