2012-08-28 17 views
5

Quiero crear un diccionario que se puede acceder como:manera Pythonic para crear dict 3d

d[id_1][id_2][id_3] = amount 

A partir de ahora tengo una gran 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 Pythonic ¿para hacer esto?

nota, que ingreso el principal ... pero lo que quiero es la cantidad .. Así que si todas las tres claves están ahí ... ¡agregue capital a la cantidad anterior!

Gracias

Respuesta

15

Es posible que desee considerar el uso de defaultdict:

Por ejemplo:

json_dict = defaultdict(lambda: defaultdict(dict)) 

creará un defaultdict de defaultdict s de dict s (I know..but es correcto), para acceder, simplemente puede hacer:

json_dict['context']['name']['id'] = '42' 

sin tener que recurrir al uso de if...else para inicializar.

+1

Gracias, perfecto. – Chuck

+0

Guau, esto es muy simple y útil. – scai

5
from collections import defaultdict 

d = defaultdict(lambda : defaultdict(dict)) 

d[id_1][id_2][id_3] = amount 
4

Usted puede hacer un diccionario simple que crea otros nuevos (usando Autovivification):

>>> 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á límite de dimensiones como el predeterminado con dict.

o una versión más simple usando defaultdict (desde el enlace wiki de arriba):

def auto_dict(): 
    return defaultdict(auto_dict) 
4
>>> 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"}}}' 
+0

Siempre he tenido la intención de investigar la manipulación de json, pero lo pospuse para otros pequeños proyectos por miedo. Este es un ejemplo realmente claro. Es genial ver soluciones alternativas, en caso de que necesite hacer un diccionario 4-d o más. (En un momento, pensé que todo lo que necesitaría era un diccionario 2-d). – aschultz

Cuestiones relacionadas