[Python] Как получить доступ к элементу набора с использованием эквивалентного объекта?


Answers

Ваш случай использования звучит так, как будто он используется для словарей. Используйте в качестве ключей атрибут объекта, который сравнивается с «чужим» объектом, а также как значения самих объектов.

Если это простой случай использования, и вы можете иметь линейный seartch, однако, вы могли бы сделать очевидное - это было бы неплохо:

def get_equal(in_set, in_element):
   for element in in_set:
       if element == in_element:
           return element
   return None 

Если вам нужно то, что именно вы запрашиваете (я могу задаться вопросом о некоторых случаях использования) - wya to go заключается в создании пользовательского словарного класса, который имеет набор как один из его членов, реализует прокси-механизмы для набора элементов , а также в словарных и установочных методах синхронизирует как словарь, так и заданное содержимое. Это займет много времени, чтобы реализовать право, но относительно просто.

Question

Если у меня есть объект, который сравнивается с элементом набора Python, но не является тем же самым объектом, существует ли разумный способ получить ссылку на объект в наборе? Вариант использования будет использовать набор для идентификации и обмена дублированными данными.

Пример (Python 2.7):

>>> a = "This is a string"
>>> b = "This is a string"
>>> a is b
False
>>> a == b
True
>>> s = set((a,))
>>> b in s
True

Как получить ссылку на использование b и s ? Я могу думать об одном способе, но я не уверен, что это не зависит от реализации, независимо от того, получаете ли вы или b . EDIT: это не работает, когда s имеет более одного элемента; пересечение вполне естественно реализовано примерно как [x for x in smaller_set if x in larger_set]

>>> for x in set((b,)).intersection(s): c = x
...
>>> c is a
True

Возможно, хорошим обходным путем было бы использование dict, который отображает каждую клавишу для себя, а не из набора.