Python: получение элементов из набора

В общем, наборы 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 ) можно было объединить способом, требуемым бизнес-логикой. Это возвращает меня к моей проблеме: мне нужен способ получить экземпляры из набора .

Есть ли способ сделать это? Или здесь единственный реальный вариант - использовать словарь?

6
задан Channel72 12 May 2011 в 15:00
поделиться