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))
我不知道为什么我的代码是错误的。 调用递归函数时,是否不会再次调用输出列表? 在我编写的代码执行过程中是否连续调用空的输出列表? (输出列表是否在每次调用时都要经过初始化的过程?)
答案 0 :(得分:0)
您的错误是您使用了“ 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
切换到新列表。