사전에 물건을 넣을 수있는 해시 가능한 식별자가 있습니다.파이썬에서 어떻게 사전에서 키를 검색 할 수 있습니까?
class identifier():
def __init__(self, d):
self.my_dict = d
self.my_frozenset = frozenset(d.items())
def __getitem__(self, item):
return self.my_dict[item]
def __hash__(self):
return hash(self.my_frozenset)
def __eq__(self, rhs):
return self.my_frozenset == rhs.my_frozenset
def __ne__(self, rhs):
return not self == rhs
해시 및 평등을 위해 식별자를 캡슐화하는 노드 형식이 있습니다.
class node:
def __init__(self, id, value):
# id is of type identifier
self.id = id
self.value = value
# define other data here...
def __hash__(self):
return hash(self.id)
def __eq__(self, rhs):
if isinstance(rhs, node):
return self.id == rhs.id
### for the case when rhs is an identifier; this allows dictionary
### node lookup of a key without wrapping it in a node
return self.id == rhs
def __ne__(self, rhs):
return not self == rhs
일부 노드를 사전에 넣습니다.
d = {}
n1 = node(identifier({'name':'Bob'}), value=1)
n2 = node(identifier({'name':'Alex'}), value=2)
n3 = node(identifier({'name':'Alex', 'nationality':'Japanese'}), value=3)
d[n1] = 'Node 1'
d[n2] = 'Node 2'
d[n3] = 'Node 3'
얼마 후, 나는 유일한 식별자가 있습니다.
my_id = identifier({'name':'Alex'})
이 사전에이 식별자와 함께 저장된 노드를 효율적으로 검색하는 방법이 있습니까?
이것은 소리보다 조금 까다 롭습니다. 나는 쉽게 d[my_id]
을 사용하여 관련 항목 'Node 2'
를 검색 할 수 있지만 는 n2
에 대한 참조를 효율적으로 반환하고자합니다.
d
의 모든 요소를 살펴봄으로써이 작업을 수행 할 수 있음을 알고 있습니다.하지만 시도해 보았습니다. 너무 느립니다 (사전에 수천 개의 항목이 있으며 시간이 많이 걸립니다).
내부적으로 dict
가 해당 식별자에 대해 hash
및 eq
연산자를 사용하여 노드 n2
및 관련 항목 'Node 2'
을 저장한다는 것을 알고 있습니다. 사실, my_id
을 찾기 위해 my_id
을 사용하면 실제로 n2
를 중간 단계로 검색해야하므로 이 가능해야합니다.
이 데이터를 그래프에 저장하는 데 사용하고 있습니다. 노드에는 해시에 사용되지 않는 추가 데이터가 많이 있습니다 (여기서 value
을 넣습니다). 나는 (networkX) 사용하고있는 그래프 패키지를 만들지 않았지만 내 노드를 저장하는 사전을 볼 수있다. 나는 또한 노드에 대한 식별자 주위에 여분의 사전을 유지할 수 있지만 이것은 고통이 될 것이다 (나는 그래프 클래스를 래핑하고 모든 노드를 다시 작성해야한다. 노드를 제거하고 목록에서 노드를 추가하고 목록에서 노드를 제거하고 가장자리를 추가해야한다. , 등등은 해당 사전을 최신 상태로 유지하는 기능).
이것은 꽤 수수께끼입니다. 어떤 도움이라도 정말 감사 할 것입니다!
이후 버전을. G.add_node (id, name = 'Bob', value = 2)를 시도한 다음 G.node [id]를 검사하십시오. – Aric
+1 좋은 댓글. 나는 이것을 사용하여 내가 사용하고있는 여분의 것들을 저장했지만, 모든 노드 유형이 가져야하는 메소드와 멤버가 있었기 때문에 좀 더 객체 지향적 인 디자인으로 바뀌었다. 그것은 단지 '가치'가 아닙니다. 내가'노드 '안에 저장하는 많은 것들이 있습니다. – user