1

多くの検索を行った後、これを行う方法を見つけることができないようです。

口述:

mdr = {'main': {'sm': {'testm': {'test1': 'test', 'test2': 'test'}}, 'lm': {}, 'l': {}}}

次のようにしたいと思います。

-Main
--SM
---Testm
----Test1:Test
----Test2:Test
--LM
--L

処理されるサブディレクトリの正確な量がわからないため、ダイレクト全体を通過するループを作成する必要があります。ディクショナリがどこまで進んでいるかを知っている場合にのみ、ディレクトリ全体を表示する方法を知っています。可能であれば、可能なすべてのキーを表示したいと思います。

4

3 に答える 3

4

再帰はループよりも優れていると思います。これはかなり近いです。

def print_dict(d, current_depth=1):
    for k, v in d.items():
        if isinstance(v, dict):
            print '-' * current_depth + str(k)
            print_dict(v, current_depth + 1)
        else:
            print '-' * current_depth + str(k) + ':' + str(v)

出力 (辞書の構文を修正した後):

>>> print_dict(mdr)
-main
--lm
--l
--sm
---testm
----test1:test
----test2:test

ケースは目的の出力から外れていますが、それを処理できるはずです。元の順序を維持したい場合は、 のOrderedDict代わりにを使用する必要がありますdictdictはハッシュ テーブルなので、順序で何でもできます。(幸いなことに、isinstance(v, dict)テストは引き続き で動作しOrderedDictます。)

于 2013-06-11T04:36:27.453 に答える
1
def tree(data, indent=0):
    if isinstance(data, basestring):
        print '{i}{d}'.format(i='-'*indent, d=data)
        return
    for key, val in data.iteritems():
        if isinstance(val,  dict):
            print '{i}{k}'.format(i='-'*indent, k=key)
            tree(val, indent + 1)
        else:
            print '{i}{k}:{v}'.format(i='-'*indent, k=key, v=val)

tree(mdr)

出力:

main
-sm
--lm
--testm
---test1:test
---test2:test
--l

コンソールからの入力 (この回答に関するコメントへの回答):

>>> mdr = {'main': {'sm': {'testm': {'test1': 'test', 'test2': 'test'}, 'lm': {}, 'l': {}}}}
>>> def tree(data, indent=0):
        if isinstance(data, basestring):
            print '{i}{d}'.format(i='-'*indent, d=data)
            return
        for key, val in data.iteritems():
            if isinstance(val,  dict):
                print '{i}{k}'.format(i='-'*indent, k=key)
                tree(val, indent + 1)
            else:
                print '{i}{k}:{v}'.format(i='-'*indent, k=key, v=val)

>>> tree(mdr)
main
-sm
--lm
--testm
---test1:test
---test2:test
--l
>>> 
于 2013-06-11T04:44:06.630 に答える