【问题标题】:Flattening using a recursive function使用递归函数展平
【发布时间】:2020-12-07 07:52:54
【问题描述】:
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))

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

【问题讨论】:

  • 这可以使用列表理解来完成,但我认为这没有任何意义?
  • type(item)==list 行更改为isinstance(item, list) bcoz 这是在python中检查数据类型的方法

标签: python list function recursion


【解决方案1】:

您的错误是您使用了 'flatten(item)' 然后 return 输出。这种不一致使得“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

编辑: 再次看到您的代码后,我(特别是函数名称)看到您可能想要更改列表“数据”而不返回值是数据的新列表“输出”值变平。一个解决方案是:

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

简短解释为什么您的代码错误:该函数在 flatten(item) 行中奇迹般地工作(也就是说,该函数设法使 data 变平)。函数返回一个新的item 扁平化副本 (output) 并且不会更改它(您可能需要查看pointers)。然后,item 保持不变并添加到新的输出列表中,然后您将其返回。

我的第一个解决方案会起作用,因为我们“接受”返回解决方案(它有它的好处,data 没有改变)。我们保存 flatten(data) 的返回值并将其添加到输出中,然后我们将其返回。

我的第二个解决方案将起作用,因为我们“接受”了不断变化的数据。也就是将data中的pointer切换到新列表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 2019-06-30
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多