for k, v in d.iteritems():
    if type(v) is dict:
        for t, c in v.iteritems():
            print "{0} : {1}".format(t, c)我尝试遍历字典并打印出值不是嵌套字典的所有键值对。如果值是一个字典,我想进入它并打印出它的键值pairs...etc。有什么帮助吗?
编辑
这个怎么样?它仍然只打印一件东西。
def printDict(d):
    for k, v in d.iteritems():
        if type(v) is dict:
            printDict(v)
        else:
            print "{0} : {1}".format(k, v)完整测试用例
字典:
{u'xml': {u'config': {u'portstatus': {u'status': u'good'}, u'target': u'1'},
      u'port': u'11'}}结果:
xml : {u'config': {u'portstatus': {u'status': u'good'}, u'target': u'1'}, u'port': u'11'}发布于 2012-05-25 22:47:57
正如Niklas所说,你需要递归,即你想定义一个函数来打印你的dict,如果值是dict,你想使用这个新dict调用你的print函数。
类似于:
def myprint(d):
    for k, v in d.items():
        if isinstance(v, dict):
            myprint(v)
        else:
            print("{0} : {1}".format(k, v))发布于 2016-05-04 19:45:26
如果你使用堆栈编写自己的递归实现或迭代等效项,就会出现潜在问题。请参阅此示例:
    dic = {}
    dic["key1"] = {}
    dic["key1"]["key1.1"] = "value1"
    dic["key2"]  = {}
    dic["key2"]["key2.1"] = "value2"
    dic["key2"]["key2.2"] = dic["key1"]
    dic["key2"]["key2.3"] = dic在正常意义上,嵌套字典将是一个类似n元树的数据结构。但是的定义并不排除交叉边缘甚至是后边缘的可能性(因此不再是一棵树)。例如,这里的key2.2保存来自key1的字典,key2.3指向整个字典(后边缘/周期)。当存在后沿(循环)时,堆栈/递归将无限运行。
                          root<-------back edge
                        /      \           |
                     _key1   __key2__      |
                    /       /   \    \     |
               |->key1.1 key2.1 key2.2 key2.3
               |   /       |      |
               | value1  value2   |
               |                  | 
              cross edge----------|如果您从Scharron打印此实现的字典
    def myprint(d):
      for k, v in d.items():
        if isinstance(v, dict):
          myprint(v)
        else:
          print "{0} : {1}".format(k, v)您将看到以下错误:
    RuntimeError: maximum recursion depth exceeded while calling a Python objectsenderle的实现也是如此。
类似地,您可以从Fred Foo获得此实现的无限循环。
    def myprint(d):
        stack = list(d.items())
        while stack:
            k, v = stack.pop()
            if isinstance(v, dict):
                stack.extend(v.items())
            else:
                print("%s: %s" % (k, v))然而,Python实际上会检测嵌套字典中的循环:
    print dic
    {'key2': {'key2.1': 'value2', 'key2.3': {...}, 
       'key2.2': {'key1.1': 'value1'}}, 'key1': {'key1.1': 'value1'}}"{...}“是检测到循环的位置。
根据Moondra的要求,这是一种避免循环(DFS)的方法:
def myprint(d): 
    stack = list(d.items()) 
    visited = set() 
    while stack: 
        k, v = stack.pop() 
        if isinstance(v, dict): 
            if k not in visited: 
                stack.extend(v.items()) 
        else: 
            print("%s: %s" % (k, v)) 
        visited.add(k)发布于 2012-05-25 22:52:40
因为dict是可迭代的,所以只需做几处小改动,就可以将经典的nested container iterable formula应用于此问题。这是一个Python 2版本(参见下面的3):
import collections
def nested_dict_iter(nested):
    for key, value in nested.iteritems():
        if isinstance(value, collections.Mapping):
            for inner_key, inner_value in nested_dict_iter(value):
                yield inner_key, inner_value
        else:
            yield key, value测试:
list(nested_dict_iter({'a':{'b':{'c':1, 'd':2}, 
                            'e':{'f':3, 'g':4}}, 
                       'h':{'i':5, 'j':6}}))
# output: [('g', 4), ('f', 3), ('c', 1), ('d', 2), ('i', 5), ('j', 6)]在Python2中,可以创建一个符合Mapping条件但不包含iteritems的自定义Mapping,在这种情况下,这将失败。文档并没有指出Mapping需要iteritems;另一方面,source为Mapping类型提供了一个iteritems方法。因此,对于自定义Mappings,仅在大小写情况下显式继承collections.Mapping。
在Python3中,有许多需要改进的地方。在Python3.3中,抽象基类存在于collections.abc中。它们保留在collections中也是为了向后兼容,但将我们的抽象基类放在一个名称空间中更好。因此,这将从collections导入abc。Python3.3还添加了yield from,它就是为这些情况而设计的。这不是空洞的语法糖;它可能会导致faster code以及与coroutines更合理的交互。
from collections import abc
def nested_dict_iter(nested):
    for key, value in nested.items():
        if isinstance(value, abc.Mapping):
            yield from nested_dict_iter(value)
        else:
            yield key, valuehttps://stackoverflow.com/questions/10756427
复制相似问题