如何在 Python 中存储递归函数的输出?
Posted
技术标签:
【中文标题】如何在 Python 中存储递归函数的输出?【英文标题】:How to store the output of a recursive function in 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
您能否提出一种聪明而优雅的方法来达到预期的效果?
【问题讨论】:
请详细解释“没有成功”是什么意思,您的函数应该如何工作,以及它在什么时候首先出错。 【参考方案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
【讨论】:
以上是关于如何在 Python 中存储递归函数的输出?的主要内容,如果未能解决你的问题,请参考以下文章