2009-03-17 4 views
0

Was ist eine gute Möglichkeit zum Hashing einer Hierarchie (ähnlich einer Dateistruktur) in Python?Python Hash-Funktionen

Ich könnte die gesamte Hierarchie in eine gepunktete Zeichenfolge konvertieren und dann das Hash, aber gibt es eine bessere (oder effizientere) Möglichkeit, dies zu tun, ohne ständig hin und her zu gehen?

Ein Beispiel für eine Struktur Ich möchte vielleicht Hash ist:

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

Mit Hierarchie meinen Sie die Liste der Pfadkomponenten einer einzelnen Datei, d. H. ["Usr", "local", "test", "myfile"]? – DNS

+0

Downmodding, Frage ist sehr unklar und verwirrend. – ddaa

+0

hinzugefügt ein Beispiel, um es ein wenig klarer zu machen ... – Dan

Antwort

8

Wenn Sie Zugriff auf Ihre Hierarchie Komponenten als Tupel haben, ist es nur Hash - Tupeln hashable sind. Sie können bei der Konvertierung in und aus einer Zeichenfolge mit Trennzeichen nicht viel gewinnen, aber es ist ein Anfang.

Wenn dies nicht hilft, könnten Sie möglicherweise weitere Informationen zum Speichern der Hierarchie-/Pfadinformationen bereitstellen.

+0

+1. Python ist kein Javascript, Wörterbuchschlüssel können mehr als nur Zeichenfolgen sein. Leider ist es auch nicht Lua, wo Schlüssel _any_ Wert sein können – Javier

1

Sie ein beliebiges Objekt hashable machen können, indem Sie die Sie __hash__() method

So Implementierung kann einfach eine geeignete __hash__() Methode auf die Objekte fügen Sie Ihre Hierarchie zu speichern, z.B. berechnen Sie den Hash rekursiv usw.

4

Wie möchten Sie auf Ihre Hierarchie zugreifen?

Wenn Sie sich immer für einen vollständigen Pfad gehen zu checken, dann, wie vorgeschlagen, verwenden Sie ein Tupel: zB:

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

Allerdings, wenn Sie gehen Dinge wie „schnell zu tun Wenn Sie alle Elemente unter "a -> b1" finden, kann es sinnvoller sein, sie als verschachtelte Hashtabellen zu speichern (andernfalls müssen Sie alle Elemente durchlaufen, um diejenigen zu finden, mit denen Sie interagiert haben).

Defaultdict ist wahrscheinlich die einfachste Art zu speichern. Zum Beispiel:

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