如何在 Python 中存储递归函数的输出?

How to store the output of a recursive function in Python?

我创建了一个这样的字典:

d = {1: {3: {}, 4: {6: {}}}, 5: {}}

然后我遍历所有项目,我可以递归地做:

def pretty(d, indent=0):
    for key, value in d.items():
        print('\t' * indent + str(key))

        if isinstance(value, dict):
            pretty(value, indent+1)
        else:
            print('\t' * (indent+1) + str(value))

pretty(d)

我的目标 是以我可以操作的方式将输出存储到字符串变量中。因此结果应该是这样的:

msg ="""
1
        3
        4
                6
5
"""

我尝试通过以下实施实现我的目标:

def pretty(d, indent=0, indent_before=0, msg_old=""):
    for key, value in d.items():
        #print('\t' * indent + str(key) + '({})({})'.format(indent,indent_before))
        msg = msg_old+'\t' * indent + str(key) + '({})({})\n'.format(indent,indent_before)
        if isinstance(value, dict):
            pretty(value, indent+1, indent, msg)
        else:
            print('\t' * (indent+1) + str(value))
    return msg
    
msg = pretty(result)
print(msg)

但我尝试的输出是:None

您能否建议一种巧妙而优雅的方法来达到预期的效果?

主要问题是在您的递归调用中您丢弃了 return 值(即调用 pretty 但未将 return 值附加到现有消息)。

这是一个基于您的原始代码的解决方案。

d = {1: {3: {}, 4: {6: {}}}, 5: {}}

def pretty(d, indent=0):
    msg = ''
    for key, value in d.items():
        msg += '\t' * indent + str(key) + '\n'
        if isinstance(value, dict):
            msg += pretty(value, indent+1)  # <=== see how return value is used
        else:
            msg += '\t' * (indent+1) + str(value) + '\n'
    return msg

print(pretty(d))

我知道您正在尝试实施自己的解决方案,但您从未提到内置的 pprint library/function 可以为您完成这一切:

from pprint import pformat
d = {1: {3: {}, 4: {6: {}}}, 5: {}}
print(pformat(d, indent=0))

{1: {3: {}, 4: {6: {}}}, 5: {}}

如果你的字典是well-formed,那么你可以使用:

>>> def pretty(d, indent=0):
...     return "".join(["\n" + "\t" * indent + str(k) +
...                     pretty(v, indent + 1) for k, v in d.items()])
...
>>> d = {1: {3: {}, 4: {6: {}}}, 5: {}}
>>> pretty(d)
'\n1\n\t3\n\t4\n\t\t6\n5'
>>> print(pretty(d))

1
        3
        4
                6
5