2010-08-20 10 views
7

Je suis en train de créer quelque chose suivante:Python référence dictionnaire élément du dictionnaire voisin

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

où @ key1 est fait référence au dictionnaire [ « key1 »]. Merci d'avance.

+2

Que se passerait-il si vous faisiez quelque chose comme 'dictionary ['key1'] = 4'? Est-ce que key2 doit contenir 4 ou devrait-il toujours faire référence à la liste originale? –

+0

Similaire à cette question, bien qu'il ait été posté plus tard: [Que dois-je faire quand j'ai besoin d'un dictionnaire auto-référentiel?] (Http://stackoverflow.com/questions/3738381/what-do-i-do-when-i -need-a-self-referential-dictionary) –

Répondre

4

Je développerais la version d'Aaron Digulla. Ce qu'il a est reproduit ici:

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

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

Je suppose qu'il souhaite reproduire la véritable sémantique de référence, de sorte que l'accès 'key2' vous donnera toujours un moyen d'arriver à ce que 'key1' a comme valeur. le problème est tandis que d['key1'] est un list, d['key2'] est un DictRef. Donc, pour obtenir la "valeur" de 'key1' tout ce que vous devez faire est d['key1'], mais pour 'key2' vous devez faire d[d['key2'].key]. En outre, vous ne pouvez pas avoir de référence à une référence qui fonctionne correctement, elle deviendra d[d[d['key2'].key].key]. Et comment différenciez-vous une référence d'une valeur régulière? Probablement par typochecking avec isinstance (v, DictReference) (ew).

J'ai donc une proposition pour résoudre tout cela.

Personnellement, je ne comprends pas pourquoi la véritable sémantique de référence est nécessaire. Si elles apparaissent nécessaires, elles peuvent être rendues inutiles en restructurant le problème ou en résolvant le problème. Il se peut même qu'ils n'aient jamais été nécessaires, et un simple d.update(key2=d['key1']) aurait résolu le problème.

Quoi qu'il en soit, la proposition:

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') 
) 

Maintenant, afin d'obtenir la valeur de toute clé, que ce soit une référence ou non, on pourra simplement faire d[k].value(). S'il y a des références à des références, elles seront déréférencées dans une chaîne correctement. S'ils forment une chaîne vraiment longue ou infinie, Python échouera avec RuntimeError pour une récursivité excessive.

4

Utilisez une nouvelle classe:

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

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

Notez la syntaxe étrange parce que vous avez aucun moyen de savoir à l'intérieur duquel vous créez le dictionnaire DictRef.

+3

Eh bien, puisqu'il n'est pas possible de le faire sans référencer d de toute façon, on pourrait aussi bien faire 'd = {'key1': [...]}; d.update ({'key2': d ['key2']}) '. – delnan