使用递归函数展平

时间:2020-08-18 06:59:19

标签: python list function recursion

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))

我不知道为什么我的代码是错误的。 调用递归函数时,是否不会再次调用输出列表? 在我编写的代码执行过程中是否连续调用空的输出列表? (输出列表是否在每次调用时都要经过初始化的过程?)

1 个答案:

答案 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切换到新列表。

相关问题