如何解决使用递归函数展平
def flatten(data):
output=[]
for item in data:
if type(item)==list:
flatten(item)
#Correct code: output += flatten
else:
output.append(item)
return output
example=[[1,2,3],[4,[5,6]],7,[8,9]]
print("before:",example)
print("after:",flatten(example))
我不知道为什么我的代码是错误的。 调用递归函数时,是否不会再次调用输出列表? 在我编写的代码执行过程中是否连续调用空的输出列表? (输出列表是否在每次调用时都要经过初始化的过程?)
解决方法
您的错误是您使用了“ flatten(item)”,然后返回输出。这种不一致性使“ flatten(item)”行完全不起作用。返回的值不保存。另外,我建议使用isinstance函数。可能的纠正方法是:
def flatten(data):
output = []
for item in data:
if (isinstance(item,list)):
item = flatten(item)
output+=item #or output.extend(item)
else:
item.append(item) #or item+=[item]
output.append(item)
return output
编辑:再次看到您的代码后,我(特别是函数名)看到您可能想更改列表“ data”,而不返回值是data的新列表“ output”值变平。一个解决方案是:
def flatten(data):
output = []
for item in data:
if (isinstance(item,list)):
flatten(item)
output+=item #or output.extend(item)
else:
item.append(item) #or item+=[item]
output.append(item)
data = output
代码错误的简短解释: say 函数在flatten(item)
行中奇迹般地工作(也就是说,该函数设法使data
变平)。函数返回平坦的item
的新副本(output
),并且不对其进行更改(您可能要查看pointers
)。然后,item
保持不变,并将其添加到新的输出列表中,然后返回该列表。
我的第一个解决方案将起作用,因为我们“拥抱”返回了解决方案(它有特权,data
不变)。我们保存返回的值flatten(data)
,并将其添加到输出中,然后返回。
我的第二个解决方案将起作用,因为我们“拥抱”了不断变化的数据。也就是说,将数据中的pointer
切换到新列表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。