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

У меня есть класс:

class MyClass:
    def__init__( self, name : str ) -> None:
        self.__name : str = name
        self.extra : object = None

    def __eq__( self, other : object ) -> bool:
        if not isinstance( other, MyClass ):
            return False

        return self.__name == other.__name

    def __hash__( self ) -> int:
        return hash( self.__name )

Таким образом, __name неизменен, и два MyClass равны, если они используют один и тот же __name.

У меня есть набор, определенный таким образом:

eggs = MyClass( "eggs" )
beans = MyClass( "beans" )
spam = MyClass( "spam" )
c.extra = "spam spam spam"
my_set : Set[MyClass] = { eggs, beans, spam }

Я могу проверить, есть ли spam в моем наборе:

has_spam : bool = MyClass( "spam" ) in my_set 

Но как мне получить "spam.extra" по имени? Я мог бы использовать dict, но для этого потребуется дублировать свойство name, или я мог бы повторить итерацию, но это кажется расточительным.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
335
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Невозможно делать то, что вы хотите, с набором, о котором я знаю (за исключением итерации всего этого). Насколько я понимаю, единственный способ получить что-либо из набора - это перебрать его или использовать set.pop, который дает вам произвольный элемент набора.

Вы можете использовать словарь для сопоставления того, что вы назвали __name, с extra (и избегайте использования каких-либо настраиваемых классов), т.е.

my_set = {"eggs": "some extra data", "beans": None, "spam": None}

Это похоже на тот случай, когда вы хотели бы использовать словарь, если нет дополнительных требований, о которых вы не упомянули.

Другие вопросы по теме