怎么控制python输出的字典按照层级关系显示?
比如我的字典为 demo_dir = {'a0': 1, 'b0': 2, 'c0': 3, 'd0': {'a1': [1, 2, 3], 'b1': {'a2': {'a3': 10, 'b3': [1, 2, 3]}}, 'c1': {'a2': 1}}}
我想输出为以下层级格式,这样看起来就比较清晰明了:
{
"a0": 1,
"b0": 2,
"c0": 3,
"d0": {
"a1": [
1, 2, 3
],
"b1": {
"a2": {
"a3": 10,
"b3": [
1, 2, 3
]
}
},
"c1": {
"a2": 1
}
}
}
可以用 Python 的 json 模块来输出字典。这个模块可以将 Python 对象(如字典)转换成 JSON 格式的字符串,并且可以通过设置参数来控制输出格式。
import json
# 定义字典
my_dict = {'a0': 1, 'b0': 2, 'c0': 3, 'd0': {'a1': [1, 2, 3], 'b1': {'a2': {'a3': 10, 'b3': [1, 2, 3]}}, 'c1': {'a2': 1}}}
# 使用 json.dumps 函数将字典转换成 JSON 字符串
json_str = json.dumps(my_dict, indent=4)
# 输出 JSON 字符串
print(json_str)
使用了 indent 参数可以控制输出的字典的层级关系。你还可以使用 sort_keys 参数来控制字典的键是否按照字母顺序排序。
```python
from collections import abc
a = dict(a0=1, b0=2, c0=3, d0=dict(a1=[1, 2, 3], b1=dict(a2=dict(a3=10, b3=[1, 2, 3])), c1=dict(a2=1)))
def mapping2str_v2(mapping: abc.Mapping, *, prefix: str = " ", lvl: int = 0, max_lvl: int = 3) -> str:
sub_lvl = lvl + 1
cur_prefix = prefix * lvl
sub_prefix = prefix * sub_lvl
if lvl == max_lvl: # 用来处理最大层级下的各项内容,直接按照字符串一行输出
sub_items = str(mapping)
else:
sub_items = ["{"]
for k, v in mapping.items():
sub_item = sub_prefix + k + ": "
if isinstance(v, abc.Mapping):
sub_item += mapping2str_v2(v, prefix=prefix, lvl=sub_lvl, max_lvl=max_lvl)
else:
sub_item += str(v) # 更多是用于处理各个层级非字典项的输出
sub_items.append(sub_item)
sub_items.append(cur_prefix + "}")
sub_items = "\n".join(sub_items)
return sub_items
print("max_lvl=0 -->\n", mapping2str_v2(a, max_lvl=0))
print("max_lvl=1 -->\n", mapping2str_v2(a, max_lvl=1))
print("max_lvl=2 -->\n", mapping2str_v2(a, max_lvl=2))
print("max_lvl=3 -->\n", mapping2str_v2(a, max_lvl=3))
print("max_lvl=4 -->\n", mapping2str_v2(a, max_lvl=4))
print("max_lvl=5 -->\n", mapping2str_v2(a, max_lvl=5))
```
可以使用 json 模块的 dumps 函数来实现这个功能。代码如下:
import json
# 定义字典
demo_dir = {'a0': 1, 'b0': 2, 'c0': 3, 'd0': {'a1': [1, 2, 3], 'b1': {'a2': {'a3': 10, 'b3': [1, 2, 3]}}, 'c1': {'a2': 1}}}
# 使用 json.dumps 函数将字典转换为字符串
dir_str = json.dumps(demo_dir, indent=4)
# 输出字符串
print(dir_str)