2010-08-20 13 views
7

Ich versuche folgende, etwas zu schaffen:Python Wörterbuch Bezug auf Nachbarn-Wörterbuch Element

dictionary = { 
    'key1': ['val1','val2'], 
    'key2': @key1 
} 

wo @ Schlüssel1 Referenz [ 'key1'] Zum Wörterbuch ist. Vielen Dank im Voraus.

+2

was passiert, wenn Sie etwas wie 'dictionary ['key1'] = 4'? Sollte key2 4 enthalten, oder sollte es immer noch auf die ursprüngliche Liste verweisen? –

+0

Ähnlich zu dieser Frage, obwohl es später gepostet wurde: [Was mache ich, wenn ich ein selbstreferenzielles Wörterbuch brauche?] (Http://stackoverflow.com/questions/3738381/what-do-i-do-when-i -need-a-self-referential-dictionary) –

Antwort

4

Ich würde Aaron Digullas Version erweitern. Was er jetzt hat, wird hier wiederholt:

class DictRef(object): 
    def __init__(self, d, key): self.d, self.key = d, key 

d = {} 
d.update({ 
    'key1': ['val1','val2'], 
    'key2': DictRef(d, 'key1') 
}) 

Ich nehme an, er wahre Referenzsemantik replizieren möchte, so dass 'key2' Zugriff werden Sie immer einen Weg geben, um zu bekommen, was 'key1' als Wert hat. Das Problem ist, während d['key1'] ist ein list, d['key2'] ist ein DictRef. Um den "Wert" von 'key1' zu erhalten, müssen Sie nur d['key1'] eingeben, aber für 'key2' müssen Sie d[d['key2'].key] tun. Darüber hinaus können Sie keinen Verweis auf eine Referenz haben, die normal funktioniert, es würde d[d[d['key2'].key].key] werden. Und wie unterscheiden Sie zwischen einem Referenzwert und einem regulären Wert? Wahrscheinlich durch Typprüfung mit isinstance (v, DictReference) (ew).

Also habe ich einen Vorschlag, um das alles zu beheben.

Persönlich verstehe ich nicht, warum echte Referenzsemantik notwendig ist. Wenn sie notwendig erscheinen, können sie überflüssig gemacht werden, indem das Problem oder die Lösung des Problems umstrukturiert wird. Es könnte sogar sein, dass sie nie notwendig waren, und ein einfaches d.update(key2=d['key1']) hätte das Problem gelöst.

Wie dem auch sei, auf Vorschlag:

class DictRef(object): 
    def __init__(self, d, key): 
     self.d = d 
     self.key = key 

    def value(self): 
     return self.d[self.key].value() 

class DictVal(object): 
    def __init__(self, value): 
     self._value = value 

    def value(self): 
     return self._value 

d = {} 
d.update(
    key1=DictVal(['val1', 'val2']), 
    key2=DictRef(d, 'key1') 
) 

Nun, um den Wert von jeder Schlüssel zu bekommen, ob es sich um eine Referenz ist oder nicht, würde man einfach tun d[k].value(). Wenn Verweise auf Verweise vorhanden sind, werden sie in einer Kette korrekt dereferenziert. Wenn sie eine wirklich lange oder unendliche Kette bilden, schlägt Python mit einem RuntimeError für übermäßige Rekursion fehl.

4

eine neue Klasse verwenden:

class DictRef(object): 
    def __init__(self, d, key): self.d, self.key = d, key 

d = {} 
d.update({ 
    'key1': ['val1','val2'], 
    'key2': DictRef(d, 'key1') 
}) 

Beachten Sie die ungerade Syntax, weil Sie keine Möglichkeit haben, innerhalb derer Sie DictRef erstellen Wörterbuch zu wissen.

+3

Nun, da es nicht möglich ist, dies ohne Referenzieren von d zu tun, könnten wir auch 'd = {'key1': [...]}; d.update ({'key2': d ['key2']}) '. – delnan