【问题标题】:How to store the output of a recursive function in Python?如何在 Python 中存储递归函数的输出?
【发布时间】:2020-12-23 00:46:39
【问题描述】:

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

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

您能否提出一种聪明而优雅的方法来达到预期的效果?

【问题讨论】:

  • 请详细解释“没有成功”是什么意思,您的函数应该如何工作,以及它在什么时候首先出错。

标签: python recursion methods return recursive-datastructures


【解决方案1】:

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

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

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))

【讨论】:

    【解决方案2】:

    我知道您正在尝试实现自己的解决方案,但您从未提及为您完成这一切的内置 pprint 库/函数:

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

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

    【讨论】:

    • OP 想要返回一个字符串,所以你可能想要pprint.pformat 而不是pprint.pprint
    【解决方案3】:

    如果你的 dict 格式正确,那么你可以使用:

    >>> 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
    

    【讨论】:

      猜你喜欢
      • 2020-01-07
      • 1970-01-01
      • 2019-06-19
      • 2021-05-17
      • 2014-06-27
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 2011-04-14
      相关资源
      最近更新 更多