如何在 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
我创建了一个这样的字典:
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