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

该案例与您想要的输出不同,但您应该能够处理它。如果要保留原始顺序,则需要使用 anOrderedDict而不是 a 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 回答
1

你应该展示你已经尝试过的东西。

无论如何,我认为这是一个有趣的项目。你觉得我的解决方案怎么样?它不包括您首选结果中的意外上限。但是,那么,你怎么能期待意外呢?

def dict_tree(d, i = 1):
    for key, value in d.items():
        if isinstance(value, dict):
            print '-' * i + key
            dict_tree(value, i + 1)
        else:
            print '-' * (i + 1) + key + ':' + value

应该输出:

-main
--lm
--l
--sm
---testm
-----test1:test
-----test2:test
于 2013-06-11T04:53:15.797 回答