如何以 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]:
给定一个字典,里面有字典,我想一个一个打印所有的内容。比如字典是:
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]: