Вопрос по python, set – добавить объект в коллекцию наборов python и определить по атрибуту объекта

5

у меня естьPerson класс как это:

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

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

Я хочу добавить несколько экземпляров этого класса в набор, например так:

<code>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>}
</code>

Как видите, в наборе 2 Мэри. Как я могу сделать так, чтобыPerson экземпляры с одинаковым возрастом считаются одним и тем же лицом и добавляются в набор только один раз?

Другими словами, как я могу получить результат{<Person tom>, <Person mary>}?

@ Spinlok Я думаю, ему просто нужно__hash__ реализованы. jamylak
да, в набор будет добавлен только первый sashimi
@sashimi, тогда вам нужен словарь с ключом age, объектом Person - значение. spinlok
Итак, в качестве примера,Frank, age 19 будет так же, какHeather, age 19 если вы просто сравниваете по возрасту? jamylak

Ваш Ответ

1   ответ
21

Когда новый объект добавляется в набор питонов, сначала вычисляется хеш-код объекта, а затем, если один или несколько объектов с таким же хеш-кодом уже находятся в наборе, эти объекты проверяются на равенство с новый объект.

Результатом этого является то, что вам нужно реализовать__hash__(...) а также__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__ определяются только с точки зрения возраста).

спасибо ~ это то, что я хочу, я знаю, что это странно.Person который я буду использовать, очень прост. Так что это не имеет значения, перезаписать ли или нет. Я знаю, что это нежелательно ^ _ ^, я буду использовать его осторожно sashimi

Похожие вопросы