2008-09-23 15 views
7

मैं एक dict है से एक स्तरित dict बनाने की आवश्यकता है, कि इस तरह दिखता है:एक फ्लैट एक

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

और मुझे यह पसंद देखने के लिए प्राप्त करने की आवश्यकता:

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

मैं इंगित करना चाहिए बाहर निकलें कि इस मामले में कई शीर्ष-स्तरीय कुंजी ('foo' हो सकती हैं और हो सकती हैं)। मैं शायद जो कुछ चाहिए उसे पाने के लिए मैं कुछ मिल सकता हूं, लेकिन मैं उम्मीद कर रहा था कि एक ऐसा समाधान है जो अधिक कुशल है।

उत्तर

8
इस तरह

:

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

बिग ओ नोटेशन में रनटाइम जोड़ना बेहतर होगा :) – Swati

+0

एम = योग (len (key.split ('/')) डी में कुंजी के लिए; # रनटाइम ओ (एम) है – 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

एक बेहतर तरीके से अपने dict मुद्रित करने के लिए इस lib मिल गया। pprinthttps://docs.python.org/3.2/library/pprint.html

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^