2012-11-16 52 views
1

可能重複:
Flatten (an irregular) list of lists in Python的Python:多級嵌套列表

實施例1:

可以說我有一個列表:[[1,2],[ 3,4]。我可以用兩個for循環才能夠打印出:1,2,3,4

例2:

所以,現在讓我們假設,我給出的輸出和我不知道多少嵌套列表有list1的內:

list1的= [1,[1,2,[3,5,6,[..],...,]]]]]

所以,我的問題是我將如何能夠以與第一個例子相同的格式打印每個單獨的號碼。我現在正在處理一些讓我嵌套列表的東西,但是不同的函數輸入會給我不同數量的嵌套列表。

我能想到的是要做到這一點,但我不知道isinstance部分之後做什麼:

c = 0 
for i in list1: 
    while c < len(list1): 
     if isinstance(i, list): 

     else: 
       print i 
     c += 1 

感謝

首先編輯

如果有也是一種解構所有嵌套列表的方法,以成爲一個單獨的列表,這對我來說也是一樣,但我很想知道這些問題的答案。

+0

哇,謝謝大家。下面的所有答案都適用於我,但如果我正確計算,artsiom的算法應該是線性的,這對我來說是理想的,因爲我實際上有數千個列表中的嵌套列表。 – TTT

+0

太好了。接受你最終使用的答案:) –

+0

哦,等等。所有的解決方案都是n^n。 – TTT

回答

4

itertools documentation有遍歷列表和這樣的一些非常好的例子,所以它總是AG當面臨這樣的任務時,要做好準備。

我會建議使用一臺發電機,避免了創建列表的許多層面:

def flatten_all(iterable): 
    for elem in iterable: 
     if not isinstance(elem, list): 
      yield elem 
     else: 
      for x in flatten_all(elem): 
       yield x 
      # in Python 3.3 just: yield from flatten_all(elem) 

應用:

for x in flatten_all([1, [2, [3]]]): 
    print(x) 

# or if you need a list: 
my_lst = list(flatten_all([1, [2, [3]]]) 
assert my_lst == [1, 2, 3] 

編輯:非遞歸線性版本

def flatten_all(iterable): 
    stack = [iter(iterable)] 
    while stack: 
     try: 
      elem = stack[-1].next() 
      if not isinstance(elem, list): 
       yield elem 
      else: 
       stack.append(iter(elem)) 
     except StopIteration: 
      stack.pop() 
+0

我相信這是正確的路要走。通過查看它,我認爲它和我的解決方案一樣快。但它也更靈活,因爲它構建了一個發電機。 –

1

你可以嘗試這樣的事情(代碼使您的列表平一行,以便您可以稍後打印):

def make_flat(arr): 
    res = [] 
    for l in arr: 
     if isinstance(l, list):# or isinstance(l, collections.Iterable) 
      res.extend(make_flat(l)) 
     else: 
      res.append(l) 
    return res 

flat = make_flat(list1) 
for x in flat: 
    print x 

或者:

def make_flat(arr): 
    return sum(map(lambda a: make_flat(a) if isinstance(a,(list)) else [a],arr),[]) 
+0

有了這樣的大名單,我會時間不同的解決方案... –

+0

是的,正確的 - 這就是爲什麼我喜歡解決方案與產量,但它仍然在做OP想要的是不是?它使平面列表和打印出來。沒有人說它應該適用於一個大名單? –

+0

是啊! @TTT在這裏做了評論,然後他刪除了(?)我的評論是對此的迴應。這不是批評你的解決方案:) –

1

這是一個使用遞歸的例子:

list1 = [1, [2,3,4], [5, 6, 7, [8, 9]]] 

def print_list(l): 
    for e in l: 
     if type(e) == list: 
      print_list(e) 
     else: 
      print e 

print_list(list1) 
+0

你有沒有機會知道你的遞歸bigo符號。如果我看到正確的話,那麼假設len(list)= n就是n^n。 – TTT

+1

我相信一個計算機科學家會比這個午餐休息時間的牧師回答得更好;) –

+0

正如你所說,它取決於你如何定義「n」。否則遍歷樹也將是n^n。但是對於樹和這些列表(它們看起來像樹,數據在樹葉中),它被認爲是線性的,因爲樹節點通常被認爲是數據元素(例如數據庫中的多分支樹,儘管它更多一點複雜的,可能是n = d * log(d)其中d是索引中的實際數據輸入(或鍵的數量)。 –