2014-01-25 108 views
1

我收到了此功能,但是在沒有列表理解的工作,我不知道如何與一個做到這一點:遞歸函數使用列表理解

def flatten(L): 
    a_list = [] 

    for i in L: 
     if isinstance(i, list): 
      gl = flatten(i) 
      for n in gl: 
       a_list.append(n) 

     else: 
      a_list.append(i) 

    return a_list 

    # This is how I've attempted to use list comprehension, but I get a Syntax 
    # error and I'm not sure why. 

    return [n for n in flatten(i) if isinstance(i, list) else i for i in L] 
+0

強制性問題:什麼是錯誤? –

+0

這是一個語法錯誤,因爲他試圖做'[n for flatten(i)]',但如果'isinstance(i,list)'爲false,請執行'[i for i in L]' –

回答

2

的語法錯誤可以是固定的,你得到了錯誤的優先級,你需要括號:

return [(n for n in flatten(i)) if isinstance(i, list) else i for i in L] 

這不幸的是,不會做你想要做什麼,這是不可能與一個列表理解的事情。

列表解析生成每個輸入(它就像一個map操作)一個結果,所以你不能生成一個列表,它比原來的,這是必要的扁平化較大。

在這裏尋找替代解決方案:Flatten (an irregular) list of lists

+0

Oh crap does that工作?我不認爲你可以使用else語句來更改整個列表comp,只有值!太棒了! –

+0

已更新。讓我知道它是否有幫助。 –

+0

是的,您的解決方案將生成器添加到列表中。但是,非常感謝您的洞察力!我對是否能在一個理解中做到這一點持懷疑態度。如果可能的話,我會嘗試找出更有效的方法。 – user2690972