Python循环整个字典

时间:2013-06-11 04:25:37

标签: python dictionary

经过多次搜索,我似乎无法了解如何做到这一点。

字典:

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

我希望它看起来像这样:

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

不会知道它将处理的子目录的确切数量,所以我需要创建一个循环来完成整个直接。如果我知道字典走了多远,我只知道如何显示整个目录。我希望它尽可能显示所有可能的键。

3 个答案:

答案 0 :(得分: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。)

答案 1 :(得分: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
>>> 

答案 2 :(得分: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