2012-08-28 15 views
5

Chcę utworzyć dict które mogą być dostępne jako:pythonic sposobem utworzenia 3d dict

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

Jak teraz mam ogromny brzydki funkcję:

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 

Jaki jest pythonic sposób to zrobić?

uwaga, że ​​wpisuję główny .. ale to czego chcę to kwota .. Więc jeśli wszystkie trzy klucze są tam .. dodaj głównego do poprzedniej kwoty!

Dzięki

Odpowiedz

15

Można rozważyć użycie defaultdict:

Na przykład:

json_dict = defaultdict(lambda: defaultdict(dict)) 

stworzy defaultdict z defaultdict z dict s s (I know..but jest prawo), aby uzyskać do niego dostęp, wystarczy:

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

bez konieczności uciekania się do używania if...else do inicjowania.

+1

Dzięki doskonały. – Chuck

+0

Wow, jest to bardzo proste i użyteczne. – scai

5
from collections import defaultdict 

d = defaultdict(lambda : defaultdict(dict)) 

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

można dokonać prostego słownika, który tworzy nowe (używając 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}}} 

Nie będzie mieć limitu wymiarów, jak ma defaultdict z dict.

Albo prostsza wersja użyciu defaultdict (z powyższego linku wiki):

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

Zawsze miałem na celu spojrzenie na manipulację JSON, ale odkładałem to na inne małe projekty ze strachu. To naprawdę jasny przykład. Wspaniale jest zobaczyć alternatywne rozwiązania, na wypadek gdyby potrzebowałem stworzyć słownik 4-d lub więcej. (W pewnym momencie doszedłem do wniosku, że potrzebuję tylko słownika 2-d.) – aschultz