如何以 YAML 格式打印嵌套字典

How to print a nested dictionary in YAML format

给定一个字典,里面有字典,我想一个一个打印所有的内容。比如字典是:

data = {'school': 'abc college',
 'class': {'A': 30, 'B': 25, 'C': 10},
 'student': {'A': {'Peter': 'boy'},
  'B': {'Mary': 'girl'},
  'C': {'Charles': 'boy'}}}

我想将其打印为:

school: abc college
class:
    A: 30
    B: 25
    C: 10
student:
    A:
        Peter: boy
    B:
        Mary: girl
    C: 
        Charles: boy

这意味着如果字典中有字典,我想在继续下一个元素之前先打印最深层次的字典,类似于深度优先搜索的顺序。

但是字典的层级是事先不知道的,所以for循环似乎不是一个好办法。我也试过 iter 但字典不可迭代。我想知道我怎样才能做到这一点。谢谢!

你应该通过递归函数来解决这个问题。

您必须遍历字典的键并检查值是否也是字典。如果是这样,请对该值调用该函数,否则您只需打印这些值并继续迭代。

这个问题是使用递归的好机会: 每当我们遇到一个值是字典时,我们将在这个字典上再次调用该函数。

def recursive_print_dict( d, indent = 0 ):
    for k, v in d.items():
        if isinstance(v, dict):
            print("\t" * indent, f"{k}:")
            recursive_print_dict(v, indent+1)
        else:
            print("\t" * indent, f"{k}:{v}")

如果你想要漂亮的打印,你可以尝试 pprint

In [2]: from pprint import pprint

In [3]: data = {'school': 'abc college',
   ...:  'class': {'A': 30, 'B': 25, 'C': 10},
   ...:  'student': {'A': {'Peter': 'boy'},
   ...:   'B': {'Mary': 'girl'},
   ...:   'C': {'Charles': 'boy'}}}

In [4]: pprint(data)
{'class': {'A': 30, 'B': 25, 'C': 10},
 'school': 'abc college',
 'student': {'A': {'Peter': 'boy'},
             'B': {'Mary': 'girl'},
             'C': {'Charles': 'boy'}}}

如果你真的想从头开始 你写一个递归函数

In [5]: data = {'school': 'abc college',
   ...:  'class': {'A': 30, 'B': 25, 'C': 10},
   ...:  'student': {'A': {'Peter': 'boy'},
   ...:   'B': {'Mary': 'girl'},
   ...:   'C': {'Charles': 'boy'}}}

In [6]: def pp(_dict, padding=""):
   ...:     val_str = []
   ...:     for k, v in _dict.items():
   ...:         if type(v) == dict:
   ...:             val_str.append("{padding}{key}:\n{val_str}".format(padding=padding, key=k, val_str=pp(v, padding+" ")))
   ...:         else:
   ...:             val_str.append("{padding}{key}: {val}".format(padding=padding, key=k, val=v))
   ...:     return "\n".join(val_str)
   ...:

In [7]: print(pp(data))
school: abc college
class:
 A: 30
 B: 25
 C: 10
student:
 A:
  Peter: boy
 B:
  Mary: girl
 C:
  Charles: boy

In [8]: