2010-08-20 13 views
7

estoy tratando de crear algo siguientes:diccionario de Python referencia al elemento vecino diccionario

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

donde @ es key1 referencia al diccionario [ 'key1']. Gracias de antemano.

+2

¿qué pasaría si haces algo como 'dictionary ['key1'] = 4'? ¿Debería key2 contener 4 o debería seguir haciendo referencia a la lista original? –

+0

Similar a esta pregunta, aunque fue publicada más tarde: [¿Qué hago cuando necesito un diccionario autorreferencial?] (Http://stackoverflow.com/questions/3738381/what-do-i-do-when-i -need-a-auto-referential-dictionary) –

Respuesta

4

Expandiría la versión de Aaron Digulla. Lo que ahora se ha replicado está aquí:

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

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

Asumo que desea replicar verdaderos semántica de referencia, por lo que el acceso a 'key2' siempre te dará una forma de llegar a lo 'key1' tiene como valor. el problema es mientras d['key1'] es un list, d['key2'] es un DictRef. Entonces para obtener el "valor" de 'key1' todo lo que necesita hacer es d['key1'], pero para 'key2' debe hacer d[d['key2'].key]. Además, no puede tener una referencia a una referencia que funcione sanamente, se convertiría en d[d[d['key2'].key].key]. ¿Y cómo se diferencia entre una referencia y un valor normal? Probablemente a través de la verificación de tipo con isinstance (v, DictReference) (ew).

Así que tengo una propuesta para arreglar todo esto.

Personalmente, no entiendo por qué es necesaria la verdadera semántica de referencia. Si parecen necesarios, pueden hacerse innecesarios mediante la reestructuración del problema o la solución del problema. Incluso puede ser que nunca fueron necesarios, y un simple d.update(key2=d['key1']) habría resuelto el problema.

De todos modos, la propuesta:

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

Ahora, con el fin de obtener el valor de cualquier tecla, si se trata de una referencia o no, uno podría simplemente hacer d[k].value(). Si hay referencias a referencias, serán desreferenciadas en una cadena correctamente. Si forman una cadena realmente larga o infinita, Python fallará con un RuntimeError por recursión excesiva.

4

utilizar una clase nueva:

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

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

Nota la sintaxis extraña porque no tiene manera de saber dentro de qué diccionario está creando DictRef.

+3

Bueno, como no es posible hacerlo sin hacer referencia a d de todos modos, podríamos hacer 'd = {'key1': [...]}; d.update ({'clave2': d ['clave2']}) '. – delnan