如何解决如何在Python中存储递归函数的输出?
我已经创建了这样的字典:
Cursor cursor2 = getContentResolver().query(ContactsContract.RawContacts.CONTENT_URI,null,ContactsContract.RawContacts.ACCOUNT_TYPE_AND_DATA_SET + "= ?",new String[] { "com.viber.voip" },null);
while (cursor2.moveToNext())
{
String name=cursor2.getString(cursor2.getColumnIndex(ContactsContract.RawContacts.DISPLAY_NAME_PRIMARY));
//Adding contact name into the ArrayList
myViberContacts.add(name+"\n");
//Giving the TextView the value of the arraylist
emervib.setText(myViberContacts.toString());
然后,我遍历所有项目,然后可以递归进行:
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,indent+1,indent,msg)
else:
print('\t' * (indent+1) + str(value))
return msg
msg = pretty(result)
print(msg)
您能提出一种巧妙而优雅的方法来达到预期效果吗?
解决方法
主要问题是,在递归调用中,您将丢弃返回值(即,调用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))
,
我知道您正在尝试实现自己的解决方案,但是您从未提到内置的pprint
库/函数可以为您完成全部任务:
from pprint import pformat
d = {1: {3: {},5: {}}
print(pformat(d,indent=0))
{1: {3: {},5: {}}
,
如果字典格式正确,则可以使用:
>>> 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: {},5: {}}
>>> pretty(d)
'\n1\n\t3\n\t4\n\t\t6\n5'
>>> print(pretty(d))
1
3
4
6
5
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。