Python循环整个字典

Python循环整个字典,python,dictionary,Python,Dictionary,经过多次搜索,我似乎找不出该怎么做 格言: 我希望它看起来像这样: -Main --SM ---Testm ----Test1:Test ----Test2:Test --LM --L 我不知道它将要处理的子目录的确切数量,所以我需要做一个循环,它将遍历整个direct。我只知道如果我知道字典有多远,我就知道如何显示整个目录。我想它显示所有可能的键,如果可能的话 我认为递归比循环更好。这很接近 def print_dict(d, current_depth=1): for k, v i

经过多次搜索,我似乎找不出该怎么做

格言:

我希望它看起来像这样:

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

我不知道它将要处理的子目录的确切数量,所以我需要做一个循环,它将遍历整个direct。我只知道如果我知道字典有多远,我就知道如何显示整个目录。我想它显示所有可能的键,如果可能的话

我认为递归比循环更好。这很接近

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而不是dict。dict是一个哈希表,因此它可以对该顺序执行任何操作。幸运的是,isinstancev、dict测试在OrderedDict上仍然有效。

我认为递归比循环更好。这很接近

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而不是dict。dict是一个哈希表,因此它可以对该顺序执行任何操作。幸运的是,isinstancev dict测试在OrderedDict上仍然有效

输出:

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
>>> 
输出:

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
>>> 

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

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

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

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

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

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


执行该行会给我一个语法错误。你能再查一下你的字典吗?@Xaranke更新了,对不起。执行这行代码会给我一个语法错误。你能再查一下你的字典吗?@Xaranke更新了,对不起。你知道在Python 3.x中打印的是什么吗?它会是这样的:打印“-”*当前深度+strkYeah。应该只是在Python3中为打印添加括号。谢谢,它起作用了。我真不敢相信它会像再次调用函数那样简单。明亮的你知道在Python3.x中打印的是什么吗?它会是这样的:打印“-”*当前深度+strkYeah。应该只是在Python3中为打印添加括号。谢谢,它起作用了。我真不敢相信它会像再次调用函数那样简单。明亮的I get NameError:未定义全局名称“tree”,并且输出的顺序与我的答案相同,与上面的不同。我在答案中添加了控制台I/o。啊,我明白了。在您的示例中,大括号是不同的。请注意,lm和l在输出中的缩进程度更高。原词典有一些语法错误;试着用最新的一个。离开更新后的mdr,这是因为没有遵守口述顺序。在控制台中执行>>>mdr={'main':{'sm':{'testm':{'test1':'test','test2':'test'},'test'},'lm':{},'l':{}}然后>>mdr不保持顺序。在这种情况下,必须使用collections.OrderedDict。我得到了NameError:没有定义全局名称“tree”,并且输出与我的答案的顺序相同,而不是上面的顺序。我在答案中添加了控制台I/o。啊,我明白了。在您的示例中,大括号是不同的。请注意,lm和l在输出中的缩进程度更高。原词典有一些语法错误;试着用最新的一个。离开更新后的mdr,这是因为没有遵守口述顺序。在控制台中执行>>>mdr={'main':{'sm':{'testm':{'test1':'test','test2':'test'},'test'},'lm':{},'l':{}}然后>>mdr不保持顺序。在这种情况下,必须使用collections.OrderedDict。我一整天都在看同样的东西:。你是什么意思?而且,至于展示我的尝试,我甚至不知道如何尝试。非常感谢。我一整天都在看同样的事情:。你是什么意思?而且,至于展示我的尝试,我甚至不知道如何尝试。非常感谢。