2013-03-07 72 views
3

可以說我有一個(嵌套)字典是這樣的(注意列表值):印刷字典(JSON)人類可讀

dic = {'level1': 
      {'level2':(1, 2), 
      'level3': 
        [ 
        {'level4': (1, 2)}, 
        {'level5': (1, 2)} 
        ] 
      } 
     } 

我要尋找一個合適的方法來打印這本詞典,我使用json做到這一點:

import json 
print json.dumps(dic, indent=4) 

和上面的代碼給我下面的輸出:

{ 
    "level1": { 
     "level2": [ 
      1, 
      2 
     ], 
     "level3": [ 
      { 
       "level4": [ 
        1, 
        2 
       ] 
      }, 
      { 
       "level5": [ 
        1, 
        2 
       ] 
      } 
     ] 
    } 
} 

儘管上面的輸出非常好,但仍然很難閱讀,特別是如果有多個級別和更長的名稱。 我也曾嘗試yaml

import yaml 
print yaml.dump(dic) 

給出了一個看起來很奇怪的情況如下:

level1: 
    level2: !!python/tuple [1, 2] 
    level3: 
    - level4: !!python/tuple [1, 2] 
    - level5: !!python/tuple [1, 2] 

是否有可以產生更好的轉儲任何其他圖書館,我覺得下面的輸出更易於閱讀:

"level1" 
    |---"level2":   1, 2 
    |---"level3": 
      |---"level4": 1, 2 
      |---"level5": 1, 2 

我相信上面的代碼更容易閱讀,並且可能會有這樣的python庫。

+0

默認格式的優點是它是有效的JSON。我認爲你需要推出自己的打印功能來獲取你的內容。 – 2013-03-07 16:01:06

+1

您可以嘗試[YAML](http://pyyaml.org/),但它不在標準庫中。 – 2013-03-07 16:01:49

+0

對於YAML +1,它非常易讀 – 2013-03-07 16:02:35

回答

1

這是根據activestate代碼示例進行調整的。不能說它漂亮,但可能讓你朝着正確的方向前進:

myDict = {'level1': 
     {'level2':(1, 2), 
      'level3': 
       [ 
       {'level4': (1, 2)}, 
       {'level5': (1, 2)}, 
       ], 
     'level6': [1,2,3], 
     'level7':{'level8': (1,2), 'level9': (1,2)} 
     } 
    } 



def prettyPrint(dictionary, ident = '', braces=1): 
    for key, value in dictionary.iteritems(): 
     if isinstance(value, dict): 
      print '%s%s%s%s' % (ident, braces*'[', key, braces*']') 
      prettyPrint(value, ident+' ', braces+1) 
     elif isinstance(value, list): 
      ndict=0 
      for v in value: 
       if isinstance(v, dict): 
        ndict += 1 
      if ndict: 
       print '%s%s' % (ident, key) 
       for e in value: 
        if isinstance(e, dict): 
         prettyPrint(e, ident+' ', braces+1) 
        else: 
         print ident+'%s : %s' %(key, e) 
      else: 
       print ident+'%s : %s' %(key, value) 
     else: 
      print ident+'%s : %s' %(key, value) 

prettyPrint(myDict) 


[level1] 
    level2 : (1, 2) 
    level3 
    level4 : (1, 2) 
    level5 : (1, 2) 
    level6 : [1, 2, 3] 
    [[level7]] 
    level8 : (1, 2) 
    level9 : (1, 2)