2016-09-05 8 views
4

大きなネストされた辞書があり、その構造と各レベルに1つのサンプル要素を印刷したい。例えば大規模なネストされた辞書の構造をすべての要素を印刷せずにコンパクトに印刷

from pprint import pprint 
pprint(nested) 

     {'key0': {'subkey0': {'var1': 'value1', 'var2': 'value2'}, 
      'subkey1': {'var1': 'value1', 'var2': 'value2'}, 
      'subkey10': {'var1': 'value1', 'var2': 'value2'}, 
      'subkey11': {'var1': 'value1', 'var2': 'value2'}, 
      'subkey12': {'var1': 'value1', 'var2': 'value2'}, 
      'subkey13': {'var1': 'value1', 'var2': 'value2'}, 
      'subkey14': {'var1': 'value1', 'var2': 'value2'}, 

from collections import defaultdict 
nested = defaultdict(dict) 
for i in range(10): 
    for j in range(20): 
    nested['key'+str(i)]['subkey'+str(j)] = {'var1': 'value1', 'var2': 'value2'} 

私はかなりpprintを使用して、これを印刷する場合、私は、出力の一部は次のようになり、非常に長く、すべての要素を取得します

辞書全体をコンパクトに表示するために、各レベルにはトップエレメントをほんの少ししか表示せず、残りを'...'で表す組み込みの方法やライブラリがありますか?各レベルでのみ1例と

所望の出力:('...'が印刷さもある)は、次のようなもののリストについては

{'key0': { 
    'subkey0': { 
    'var1: 'value1', 
    '...' 
    }, 
    '...' 
    }, 
    '...' 
} 

は、私がthis solutionを見つけましたが、私は、ネストされたために何かを見つけることができませんでした辞書。

答えて

1

基本的な解決策は、値をループして検出してそれぞれから見つかった最初の項目のみを印刷する独自のネストされた関数を設定することです。辞書は順序付けされていないので、ランダムに選択することを意味します。したがって、さまざまなタイプの例をインテリジェントに分離したい場合、目標は本質的に複雑です。ここ

しかし、基本的な機能は、仕事ができる方法は次のとおりです。

def compact_print(d, indent=''): 
    items = d.items() 
    key, value = items[0] 
    if not indent: 
     print("{") 

    if isinstance(value, dict): 
     print(indent + "'{}': {{".format(key)) 
     compact_print(value, indent + ' ') 
     print(indent + "'...'") 
    else: 
     print(indent + "'{}': '{}',".format(key, value)) 
     print(indent + "'...'") 
    print(indent + "}") 

このネストされた関数はちょうどそれが見つかったdictsを通って下方に反復処理し、それがつかむ最初の項目を過ぎて無視し続けています。 elif isinstance(value, list)のリストの処理を追加したり、他のタイプの処理を追加することもできます。あなたのサンプル入力の場合

、これを生成します。

{ 
'key9': { 
'subkey10': { 
    'var1': 'value1', 
    '...' 
    } 
'...' 
} 
'...' 
} 
関連する問題