2009-03-17 18 views
0

Pythonの階層構造(ファイル構造に似ています)をハッシュする良い方法はありますか?Pythonハッシュ関数

階層全体を点列に変換してハッシュすることができましたが、これまでずっと前後しないでこれを行う方が良い(または効率的な)方法がありますか?

私はハッシュしたい場合があります構造の例は次のとおりです。

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

あなたはタプルとして階層コンポーネントへのアクセスを持っている場合は、ちょうどそれをハッシュ - タプルはハッシュ可能です。区切られた文字列との間で変換を行うことはあまりないかもしれませんが、それは始まりです。

この方法で問題が解決しない場合は、おそらく階層/パス情報の保存方法に関する詳細情報を提供することができます。

+0

+1。 Pythonはjavascriptではなく、辞書キーは単なる文字列以上のものです。残念ながら、それはLuaでもなく、鍵は_any_ value – Javier

1

あなたは、単に、例えば、あなたの階層を格納するオブジェクトに適し__hash__()メソッドを追加することができますので、__hash__() method

を実装することにより、任意のオブジェクトのハッシュ可能にすることができます再帰的にハッシュを計算するなど。

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"]