2016-03-05 54 views
2

我想写一个代码来扁平化使用递归的任何嵌套列表。这是第一个代码,我写道:如何把变量的空列表改变这个Python代码?

def flatten(NL): 
    a = [] 
    for i in NL: 
     if type(i) == int: 
      a.append(i) 
     elif type(i) == list: 
      flatten(i) 
    return a 

然而,它不停,直到我改变了代码,并把变量“a”外的函数返回一个空列表:

a = [] 
def flatten(NL): 
    for i in NL: 
     if type(i) == int: 
      a.append(i) 
     elif type(i) == list: 
      flatten(i) 
    return a 

我曾尝试把我的思想包围起来无济于事。如何将功能外的空列表影响到它?

回答

1

当你把a的功能之外,您始终修改同一a,但是当你把它放在里面,你正在重新定义每次a。既然你只是说flatten(i),而你实际上没有对扁平版本做任何事情,a不会受到扁平化的影响。你需要扁平版本添加到a

def flatten(NL): 
    a = [] 
    for i in NL: 
     if type(i) == int: 
      a.append(i) 
     elif type(i) == list: 
      a += flatten(i) # Here we add the flattened version to a instead of just creating it. 
    return a 
+0

非常感谢你。读完你的回答后,我做了一些阅读,并看到每次递归调用都可以扩展。 ' 平铺(NL): 在NL A = [] 对于i: 如果(i)型== INT: a.append(ⅰ) elif的类型(I)==列表: 一个。 extend(flatten(i))#在这里,我们将拼合版本添加到一个而不是仅仅创建它。 return a ' – Taiwosam

+0

是的。这绝对是一个更好的解决方案。但有一点需要注意:如果使用isinstance(i,list):'而不是'type(i)== list:'(与int相同),那么'list'的子类的实例仍然属于这一类。如果您发现我的答案有用,请考虑将其标记为正确答案。 – zondo

0

如果你要使用递归,你是有点“双重收费”的也有一个for循环。

对于通过列表的递归操作头部和递归尾部。没有必要根本不需要声明自己的列表,这只会让它变得更加困难。

def flatten(NL): 
    if type(NL) == list: 
     if not NL: 
      return NL #empty list terminate recursion 
     return flatten(NL[0]) + flatten(NL[1:]) 
    return [NL]  #'scalar' value terminate recursion 

下面是一个例子

>>> flatten([[1,2],[3,[4,5]],[6,7]]) 
[1, 2, 3, 4, 5, 6, 7] 
+0

非常感谢。这是非常丰富的信息。 – Taiwosam