2016-06-12 5 views
0

Ich habe einen Anwendungsfall, wo ich Dinge, die sowohl einen Schlüssel und Daten enthalten. Ich möchte eine effiziente Codierung dieser Daten und der dict-Index der Daten. So ist Sache eine Klasse, und Wörterbuch ist ein dict Index seiner Instanzen:Speichereffiziente dicts - Ableiten eines Artikels Schlüssel von seinem Wert

d = {} 
class Thing: 
    def __init__(k,v): self.key=k; self.data=v; d[v]=self 

Nun würde Ich mag Sache in meinem Code wie gezeigt um Objekte zu übergeben ein einzelnes Objekt:

thing1, thing2 = d['thing1'], d['thing2'] 

Diese Lösung funktioniert. Ich kann Dinge nach Schlüssel indexieren, und ich kann einen Schlüssel von jedem Ding abrufen, aber beachten Sie, dass diese Lösungen Zeiger auf den Schlüssel sowohl im dict- als auch im Thing-Objekt redundant speichert.

Ich könnte 'dict' von Grund auf so implementieren, dass ich ihm sagen könnte, wie man vom Wert auf den Schlüssel zugreifen kann. Viele Hash-Methoden könnten daher das Speichern eines zweiten Zeigers auf den Schlüssel vermeiden.

Bietet eine der Python-dict-Implementierungen diese Flexibilität? Wenn Sie in der Lage zu behaupten, dies ist nicht möglich, würde ich es gerne hören. Danke.

HINWEIS: Der wichtige Punkt hier ist, dass später möchte ich sowohl Schlüssel und Daten als ein einzelnes Objekt mit einem einzigen Zeiger darauf behandeln, und ich möchte nicht Heap zuweisen ein Tupel, um dies zu erreichen, wie dies würde besiegen mein ursprüngliches Ziel.

+4

Warum "print" nicht mein Schlüssel ist% s und Wert ist% s "% (k, obj)' ?? Sie können auf den Wert zugreifen, dann kennen Sie den Schlüssel und müssen ihn nicht ableiten. Wenn Sie einen Schlüssel von einem Wert erhalten möchten, möchten Sie eigentlich eine zweite Karte in der anderen Richtung erstellen. – JulienD

Antwort

0

Es ist seltsam, den Schlüssel in dem Wert zu speichern, da Sie den Schlüssel haben müssen, um den Wert zu erhalten.

Wenn Sie es nicht speichern möchten, können Sie es mit einem speziellen Getter-Funktion bekommen:

def get_key_and_value(d, k): 
    return (k, d[k]) 

obj = get_key_and_value(d, k) 
print "my key is %s and value is %s" % (obj[0], obj[1]) 
+0

das könnte funktionieren, aber ich erwarte hier viele kleine Objekte, also möchte ich kein zweites Tupel-Objekt für jedes dieser Objekte erstellen. Auch würde mein Code das Tupel anstelle des Wertes übergeben müssen ... das würde mich zwingen, obj [1] überall in meinem Code zu dereferenzieren. Siehe meine umgeschriebene Frage. Ich habe versucht, mein Ziel klarer zu machen. thx –

0

Sie haben nicht den Anwendungsfall gut genug erklärt, so dass meine Führung nicht sehr präzise sein . Ich gehe von Ihrer Frage aus, dass Sie den Schlüssel NICHT in dem Wert speichern möchten, um Speicher zu sparen (wie Sie in Ihrem Beispiel gezeigt haben - und dann zurückgewiesen)? Darüber hinaus benötigen Sie eine Operation, die Zugriff auf den Wert und den Schlüssel erfordert, der für den Zugriff auf diesen Wert verwendet wird.

Ihr Glaube, dass irgendwie die Wertabruffunktion Zugriff auf den Rohschlüssel Hash haben wird, und dass von dort es irgendwie den Schlüssel abrufen könnte, ist falsch. Python-Diktate tauchen diese Information nicht auf. Ich bin sicher, dass Sie Ihre eigene Python-Erweiterung rollen können, um diese Fähigkeit zu erstellen, aber das klingt nach viel Arbeit (wieder - ohne den Anwendungsfall zu verstehen, kann ich nicht genau bestimmen, ob die Arbeit "wert ist" oder nicht) .

Erstellen Sie stattdessen einfach Ihre eigene dict-Klasse und fügen Sie Ihren Code der benutzerdefinierten Methode hinzu. Etwas wie folgt aus:

class MyDict(object): 
    def __init__(self): 
     self.d = dict() 
    def add(self, k, v): 
     self.d[k] = v 
    def later(self, k): 
     print("my key is %s and value is %s" % (k, self.d[k])) 

Wenn dies nicht das, was Sie uns erhofft hatten - können Sie den Anwendungsfall näher beschreiben?

+0

Ich habe versucht, meine Frage neu zu schreiben.Ihre Lösung gibt mir nicht Schlüssel und Wert als einzelnes Objekt. Danke. –