Jeśli mam obiekt, który jest porównywalny do elementu zestawu Python, ale nie jest tym samym obiektem, czy istnieje rozsądny sposób na uzyskanie odniesienia do obiektu w zestawie? Przypadkiem użycia byłoby użycie zestawu do identyfikacji i udostępniania zduplikowanych danych.Jak uzyskać dostęp do elementu zestawu za pomocą równoważnego obiektu?
Przykład (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
Jak uzyskać odniesienie do a
użyciu b
i s
? Mogę wymyślić jeden sposób, ale nie jestem pewien, czy to nie zależy od implementacji, czy otrzymasz a
lub b
. EDYCJA: To nie działa, gdy s ma więcej niż jeden element; skrzyżowanie jest dość naturalnie realizowane coś [x for x in smaller_set if x in larger_set]
>>> for x in set((b,)).intersection(s): c = x
...
>>> c is a
True
Być dobrym obejście byłoby użyć dict, który mapuje każdy klucz do siebie, zamiast zestawu.
Jeśli potrzebujesz konkretnego jednego z dwóch równych, możliwych do zahartowania obiektów, wydaje się prawdopodobne, że obiekty nie będą równe i/lub nieczytelne. Dlaczego tego potrzebujesz? – delnan
Myślę, że twoje podejrzenia są uzasadnione: pypy 1.7.0 i ironpython 3.0 oba (puszka) zwracają False dla twojego końcowego c jest a. – DSM
Mógłbym zaoszczędzić pamięć, zmieniając odniesienia do równego obiektu na odniesienia do tego samego obiektu. –