Chciałbym użyć obiektów NetworkX Graph
jako kluczy w Pythonie dict
. Jednak nie chcę domyślnego zachowania dla porównania (tj. Przez adres obiektu). Zamiast tego chciałbym, aby wykresy izomorficzne były kluczami do tych samych elementów w dict
.Porównanie "izomorficzne" obiektów NetworkX Graph zamiast domyślnego porównania "adresu"
Czy to zachowanie zostało już gdzieś zaimplementowane? Nie mogłem znaleźć żadnych informacji w tym kierunku.
Jeśli muszę sam je wdrożyć, czy następująca ocena jest realistyczna?
- Zawiń
networkx.Graph
w klasie. - Zdefiniuj
__eq__
w taki sposób, że wywołujeis_isomorphic
. - W jakiś sposób zdefiniuj
__hash__
(sugestie przyjęte).
Myślę, że będę musiał zrobić to owinięty Graph niezmienne, because:
Jeśli klasa definiuje zmienne obiektów i wdraża metodę
__eq__()
, nie powinien wdrożyć__hash__()
, od momentu wdrożenia hashable kolekcje wymagają, aby wartość skrótu klucza była niezmienna (jeśli wartość mieszania obiektu ulegnie zmianie, będzie ona w niewłaściwym buforze mieszającym).
Czy dobrze rozumiem, że chcesz isophorphic wykresy mieć taki sam hash value()? Jeśli tak, to pomoże ci to pytanie? - http://en.wikipedia.org/wiki/Graph_canonization – Aric
@Aric Jeśli muszę to zaimplementować, to tak, chcę, aby wykres izomorficzny miał tę samą wartość '__hash __()'. Jednak kanonizacja grafów może być przesadna. Miałem na myśli, aby uzyskać [uporządkowaną sekwencję stopni] (http://en.wikipedia.org/wiki/Degree_sequence#Degree_sequence), a następnie ją zahaczyć. W ten sposób nieizomorficzne wykresy mogą mieć ten sam skrót, ale wykresy izomorficzne nie mogą mieć różnej wartości mieszania. Ale zanim zacznę to robić, mam nadzieję, że ktoś już gdzieś to zrobił :) – user1661473
Jeśli możesz znaleźć sposób na unikatową liczbę całkowitą z sekwencji stopni, możesz użyć jej jako funkcji hash(). – Aric