2009-03-17 5 views
0

파이썬에서 계층 구조 (파일 구조와 유사)를 해싱하는 좋은 방법은 무엇입니까?파이썬 해시 함수

전체 계층 구조를 점으로 구분 된 문자열로 변환 한 다음 해시 할 수 있지만 항상 앞뒤로 이동하지 않고도 더 나은 (또는보다 효율적인) 방법이 있습니까?

내가 해시 할 수있는 구조의 예는 다음과 같습니다 당신이 튜플로 계층 구조의 구성 요소에 액세스 할 수있는 경우

a -> b1 -> c -> 1 -> d 
a -> b2 -> c -> 2 -> d 
a -> c -> 1 -> d 
+0

계층 구조를 통해 단일 파일의 경로 구성 요소 목록 [예 : "usr", "local", "test", "myfile"]을 의미합니까? – DNS

+0

다운 몰딩 질문은 매우 불분명하고 혼동 스럽습니다. – ddaa

+0

예제를 조금 더 명확하게 추가했습니다 ... – Dan

답변

8

, 그냥 해시 - 튜플 해쉬 있습니다. 구분 된 문자열을주고받는 변환을 많이 얻을 수는 없지만 시작일뿐입니다.

이 방법이 도움이되지 않는다면 아마도 계층/경로 정보를 저장하는 방법에 대한 자세한 정보를 제공 할 수 있습니다.

당신은 그래서 당신은 간단하게 예를 들어, 계층 구조를 저장하는 객체에 적절한 __hash__() 방법을 추가 할 수 있습니다 __hash__() method

를 구현하여 모든 객체 해쉬를 만들 수 있습니다

+0

+1. 파이썬은 자바 스크립트가 아니며 사전 키는 문자열 이상일 수 있습니다. 불행히도 루아가 아니기 때문에 키가 _any_ value 일 수 있습니다. – Javier

1

재귀 적으로 해시 계산 등을 수행합니다.

4

어떻게 계층 구조에 액세스 하시겠습니까?

당신은 항상 제안 후, 전체 경로를 확인 할 거라면, 튜플을 사용 예 :

>>> d["a","b1","c",1,"d"] = value 

그러나, 당신은 빨리 "와 같은 일을 할 거라면 "a -> b1"아래의 모든 항목을 찾으면 중첩 된 해시 테이블로 저장하는 것이 더 효과적 일 수 있습니다. 그렇지 않으면 모든 항목을 반복하여 사용자가 속한 것을 찾는 것이 좋습니다.

defaultdict는 아마도 가장 쉬운 저장 방법입니다. 예 :

from collections import defaultdict 

def new_dict(): return defaultdict(new_dict) 
d = defaultdict(new_dict) 

d["a"]["b1"]["c"][1]["d"] = "test" 
d["a"]["b2"]["c"][2]["d"] = "test2" 
d["a"]["c"][1]["d"] = "test3" 

print d["a"]["c"][1]["d"] # Prints test3 
print d["a"].keys()  # Prints ["c", "b1", "b2"]