2012-08-28 8 views
5

Voglio creare un dict cui si può accedere come:modo divinatorio per creare 3d dict

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

A partire da ora ho un enorme brutto funzione:

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 

Qual è il modo divinatorio per fare questo?

nota, che inserisco il principale .. ma quello che voglio è l'importo .. Quindi se tutte e tre le chiavi ci sono .. aggiungere il capitale alla quantità precedente!

Grazie

risposta

15

Si consiglia di considerare l'utilizzo di defaultdict:

Ad esempio:

json_dict = defaultdict(lambda: defaultdict(dict)) 

creerà un defaultdict di defaultdict s di dict s (I know..but è giusto), per accedervi, è sufficiente fare:

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

senza dover ricorrere all'utilizzo di if...else per l'inizializzazione.

+1

Grazie, perfetto. – Chuck

+0

Wow, questo è sia molto semplice che utile. – scai

5
from collections import defaultdict 

d = defaultdict(lambda : defaultdict(dict)) 

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

si può fare un semplice dizionario che crea di nuovi (utilizzando 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}}} 

Questo non avrà limiti di dimensioni come il dump predefinito con dict.

o una versione più semplice utilizzando defaultdict (dal link wiki sopra):

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

Avevo sempre avuto intenzione di esaminare la manipolazione di JSON, ma l'ho rimandato per altri piccoli progetti per paura. Questo è un esempio molto chiaro. È bello vedere soluzioni alternative, nel caso avessi bisogno di creare un dizionario in 4 o più dizionari. (Una volta, ho pensato che tutto quello di cui avevo bisogno era un dizionario 2-d.) – aschultz

Problemi correlati