Если у меня есть объект, который сравнивается с элементом набора 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
Как получить ссылку на a
используя b
и s
? Я могу думать об одном способе, но я не уверен, что это не зависит от реализации, получаете ли вы a
или 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, который отображает каждый ключ к себе, а не множества.
Если вам нужен определенный один из двух равных хешируемых объектов, кажется вероятным, что объекты не должны быть равными и/или хешируемыми. Зачем тебе это нужно? – delnan
Я думаю, что ваши подозрения оправданы: pypy 1.7.0 и ironpython 3.0 оба (могут) возвращать False для вашего окончательного c. – DSM
Я мог бы сэкономить память, изменив ссылки на равный объект на ссылки на один и тот же объект. –