python字典以层级关系输出

怎么控制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 函数来实现这个功能。代码如下:

  • 使用 json.dumps 函数将字典转换为字符串
  • 使用 indent 参数指定了缩进的空格数
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)