2013-01-10 83 views

回答

1

一種方法是使用遞歸,這樣的事情應該工作:

def flatten_list(l): 
    new_l = [] 
    for item in l: 
     if type(item) == type([]): 
      new_l += flatten_list(item) 
     else: 
      new_l.append(item) 
    return new_l 

我沒有測試這個代碼,但想法是在那裏。

+0

這看起來很簡單!謝謝 !只是因爲它沒有測試就像現在一樣工作! :) –

3
def flatten(lis): 
    for i in lis: 
     if isinstance(i, collections.Iterable) and not isinstance(i, basestring): 
      for sub in flatten(i): 
       yield sub 
     else: 
      yield i 

Christian's solution攝於this question

如果你想返回一個列表,你可以使用這個:

def flatten(lis): 
    flat_list = [] 
    for i in lis: 
     if isinstance(i, collections.Iterable) and not isinstance(i, basestring): 
      flat_list.extend(flatten(i)) 
     else: 
      flat_list.append(i) 
    return flat_list 

然而,對於大名單,發電機功能是更有效的它不會計算下一個值,除非它將值存儲在內存中。

+0

+1顯示發電機。輸入可以任意大,這將表現良好。 –

+0

在我的軟件(Blender ...使用python3)...我得到這種錯誤,這種解決方案:「全球名稱」收集「沒有定義」 –

+0

ops ...這是我錯過了一個模塊導入。但現在錯誤是關於「basestring」。 –