В общем, наборы Python, похоже, не предназначены для получения элементов по ключу. Очевидно, для этого и нужны словари. Но есть ли вообще, что при наличии ключа вы можете получить экземпляр из набора, который равен ключу?
Опять же, я знаю, что это именно то, для чего нужны словари, но, насколько я понимаю, есть законные причины хотеть сделать это с набором . Предположим, у вас есть класс, определенный примерно так:
class Person:
def __init__(self, firstname, lastname, age):
self.firstname = firstname
self.lastname = lastname
self.age = age
Теперь предположим, что я собираюсь создать большое количество объектов Person
, и каждый раз, когда я создаю объект Person
, мне нужен чтобы убедиться, что это не копия предыдущего объекта Person
. Человек
считается дубликатом другого Человека
, если у него такое же имя
, независимо от других переменных экземпляра. Естественно, очевидным является вставка всех объектов Person
в набор, и определите методы __ hash __
и __ eq __
, чтобы объекты Person
сравнивались по их имени
.
Альтернативный вариант: создать словарь объектов Person
и использовать отдельно созданную строку firstname
в качестве ключа. Недостатком здесь является то, что я дублирую строку firstname
. В большинстве случаев это не проблема, но что, если у меня есть 10 000 000 объектов Person
? Избыточное хранилище строк действительно может начать увеличиваться с точки зрения использования памяти.
Но если два объекта Person
сравниваются одинаково, Мне нужно получить исходный объект, чтобы дополнительные переменные экземпляра (помимо firstname
) можно было объединить способом, требуемым бизнес-логикой. Это возвращает меня к моей проблеме: мне нужен способ получить экземпляры из набора
.
Есть ли способ сделать это? Или здесь единственный реальный вариант - использовать словарь?