2008-09-23 9 views
7

Mam dict, który wygląda tak:trzeba utworzyć warstwową dict z płaskiego jednego

{ 
    'foo': { 
     'opt1': 1, 
     'opt2': 2, 
     }, 
    'foo/bar': { 
     'opt3': 3, 
     'opt4': 4, 
     }, 
    'foo/bar/baz': { 
     'opt5': 5, 
     'opt6': 6, 
     } 
    } 

I muszę dostać to wyglądać tak:

{ 
    'foo': { 
     'opt1': 1, 
     'opt2': 2, 
     'bar': { 
      'opt3': 3, 
      'opt4': 4, 
      'baz': { 
       'opt5': 5, 
       'opt6': 6, 
       } 
      } 
     } 
    } 

Zwracam że istnieje i będzie wiele kluczy najwyższego poziomu ("foo" w tym przypadku). Prawdopodobnie mógłbym coś zrzucić, aby uzyskać to, czego potrzebuję, ale miałem nadzieję, że istnieje rozwiązanie, które jest bardziej wydajne.

Odpowiedz

8

Jak to:

def nest(d): 
    rv = {} 
    for key, value in d.iteritems(): 
     node = rv 
     for part in key.split('/'): 
      node = node.setdefault(part, {}) 
     node.update(value) 
    return rv 
+0

Dodawanie środowiska wykonawczego w notacji Big O byłoby jeszcze lepsze :) – Swati

+0

M = suma (len (key.split ('/')) dla klucza w d); # Runtime to O (M) – jfs

1
def layer(dict): 
    for k,v in dict: 
    if '/' in k: 
     del dict[k] 
     subdict = dict.get(k[:k.find('/')],{}) 
     subdict[k[k.find('/')+1:]] = v 
     layer(subdict) 
0

Got to lib wydrukować dict w lepszy sposób. pprint. https://docs.python.org/3.2/library/pprint.html