2016-06-19 10 views
1

Python辞書オブジェクトをこのフォーラムで再帰的に反復する方法が見つかりました。しかし、私はファイルパスの構造に似た文字列を得るようにその関数を拡張したいと思います。下記の私の機能では、Python辞書からファイル 'パスのような文字列'を作成する

/key1/value1 
/key2/value2 
/key3/key3a/value3a 
/key4/key4a/key4a1/value4a1 
/key4/key4a/key4a2/value4a2 
/key4/key4a/key4a3/value4a3 
/key4/key4b/key4b1/key4b1a/value4b1a 
/key4/key4b/key4b1/key4b1b/value4b1b 
/key4/key4b/key4b1/key4b1c/value4b1c 
/key4/key4c/key4c1/key4c1a/value4c1a 
/key4/key4c/key4c1/key4c1b/value4c1b 
/key4/key4c/key4c1/key4c1c/value4c1c 

という形で出力を期待しています。残念ながら、私はブロックを打ちました。私はそれを達成する方法を理解できません。以下は私が思いついたコードです。どんな助けでも大歓迎です。

import sys 
import collections 


dict_object = { 
    'key1': 'value1', 
    'key2': 'value2', 
    'key3': {'key3a': 'value3a'}, 
    'key4': { 
     'key4a': { 
      'key4a1': 'value4a1', 
      'key4a2': 'value4a2', 
      'key4a3': 'value4a3' 
     }, 
     'key4b': { 
      'key4b1': { 
       'key4b1a': 'value4b1a', 
       'key4b1b': 'value4b1b', 
       'key4b1c': 'value4b1c' 
      }, 
      'key4c': { 
       'key4c1': { 
        'key4c1a': 'value4c1a', 
        'key4c1b': 'value4c1b', 
        'key4c1c': 'value4c1c' 
       } 
      } 
     } 
    } 
} 

def print_dict(dictionary, path='', parent=''): 
    """ This finction recursively prints nested dictionaries.""" 

    #Sort the dictionary object by its keys 
    if isinstance(dictionary, dict): 
     dictionary = collections.OrderedDict(sorted(dictionary.items())) 
    else: 
     dictionary = sorted(dictionary.items(), key=operator.itemgetter(1)) 

    #iterate each sorted dictionary key 
    for key, value in dictionary.iteritems(): 
     if isinstance(value, dict): 
      path = '' 
      path = '%s/%s/%s' % (path, parent, key) 

      #Repeat this funtion for nested {} instances 
      print_dict(value, path, key) 
     else: 
      #Print the last node i.e PATH + KEY + VALUE 
      print '%s/%s/%s' % (path, key, value) 

if __name__ == '__main__': 
    print_dict(dict_object) 
+0

'os.path.join()を使ってください、あなたが実際にパスを使用すると、異なるOSを心配させたくない場合は、'役に立つことができます:

これは、予想される出力を生成します。 [Docs](https://docs.python.org/2/library/os.path.html)。 – patrick

答えて

2

あなたの機能はあまりにも複雑に見えます。辞書ではないオブジェクトがある場合にのみ実際に印刷します。そうでない場合はすべての値を辞書に返します。私はOrderedDictオブジェクトを作成すると気にしませんでした

def print_dict(ob, path=''): 
    if not isinstance(ob, dict): 
     print '{}/{}'.format(path, ob) 
    else: 
     for key, value in sorted(ob.items()): 
      print_dict(value, '{}/{}'.format(path, key)) 

;:私はちょうど1つの文字列に取り扱うのパスを簡素化必要なのはソートされた順序での反復だけです。

>>> print_dict(dict_object) 
/key1/value1 
/key2/value2 
/key3/key3a/value3a 
/key4/key4a/key4a1/value4a1 
/key4/key4a/key4a2/value4a2 
/key4/key4a/key4a3/value4a3 
/key4/key4b/key4b1/key4b1a/value4b1a 
/key4/key4b/key4b1/key4b1b/value4b1b 
/key4/key4b/key4b1/key4b1c/value4b1c 
/key4/key4b/key4c/key4c1/key4c1a/value4c1a 
/key4/key4b/key4c/key4c1/key4c1b/value4c1b 
/key4/key4b/key4c/key4c1/key4c1c/value4c1c 
関連する問題