2008-09-23 3 views
7

ich ein dict haben zu schaffen, sieht das wie folgt aus:Sie benötigen einen geschichteten dict aus einem flachen einem

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

Und ich brauche, um es zu wie folgt aussehen:

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

möchte ich darauf aus, dass es mehrere Schlüssel auf oberster Ebene geben kann und geben wird (in diesem Fall 'foo'). Ich könnte wahrscheinlich etwas zusammenwerfen, um zu bekommen, was ich brauche, aber ich hatte gehofft, dass es eine Lösung gibt, die effizienter ist.

Antwort

8

So:

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

Hinzufügen von Laufzeit in Big O Notation wäre noch besser :) – Swati

+0

M = Summe (len (key.split ('/')) für den Schlüssel in d); # Laufzeit ist 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

diese lib Haben Sie Ihre dict in einer besseren Art und Weise zu drucken. pprint. https://docs.python.org/3.2/library/pprint.html

Verwandte Themen