2016-03-05 124 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