4

このような(ネストされた)辞書があるとしましょう(リスト値に注意してください):

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 ライブラリが存在する可能性があると思います。

4

1 に答える 1

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)
于 2013-03-07T20:44:21.400 に答える