Quiero crear un dict que se puede acceder como:
d[id_1][id_2][id_3] = amount
A partir de ahora tengo una enorme función fea:
def parse_dict(id1,id2,id3,principal, data_dict): if data_dict.has_key(id1): values = data_dict[id1] if values.has_key[id2] .. else: inner_inner_dict = {} # and so on
¿Cuál es la forma pythonica de hacer esto?
tenga en cuenta que ingresé el principal … pero lo que quiero es la cantidad … Entonces, si las tres teclas están ahí … ¡agregue el principal a la cantidad anterior!
Gracias
Es posible que desee considerar el uso de defaultdict
:
Por ejemplo:
json_dict = defaultdict(lambda: defaultdict(dict))
creará una sentencia por defecto de las predicciones predeterminadas de los dictados (lo sé … pero es correcto), para acceder a ella, simplemente puede hacer:
json_dict['context']['name']['id'] = '42'
sin tener que recurrir a usar if...else
para inicializar.
from collections import defaultdict d = defaultdict(lambda : defaultdict(dict)) d[id_1][id_2][id_3] = amount
Puede crear un diccionario simple que cree nuevos (utilizando la Autovivificación ):
>>> class AutoDict(dict): def __missing__(self, key): x = AutoDict() self[key] = x return x >>> d = AutoDict() >>> d[1][2][3] = 4 >>> d {1: {2: {3: 4}}}
Esto no tendrá un límite de dimensiones como el valor predeterminado con dict.
O una versión más simple usando defaultdict
(del enlace wiki anterior):
def auto_dict(): return defaultdict(auto_dict)
>>> from collections import defaultdict >>> import json >>> def tree(): return defaultdict(tree) >>> t = tree() >>> t['a']['b']['c'] = 'foo' >>> t['a']['b']['d'] = 'bar' >>> json.dumps(t) '{"a": {"b": {"c": "foo", "d": "bar"}}}'
Tal vez necesite echar un vistazo a las matrices multidimensionales, por ejemplo en numpy:
http://docs.scipy.org/doc/numpy/reference/arrays.ndarray.html