2016-03-02 53 views
0

下面是代碼如何在Python中使用遞歸來收集嵌套列表?

def list_all(obj): 
    """ 
    Return a list of all non-list elements in obj or obj's sublists, if obj is a list. Otherwise, return a list containing obj. 

    @param list|object obj: object to list 
    @rtype: list 

    >>> obj = 17 
    >>> list_all(obj) 
    [17] 
    >>> obj = [1, 2, 3, 4] 
    >>> list_all(obj) 
    [1, 2, 3, 4] 
    >>> obj = [[1, 2, [3, 4], 5], 6] 
    >>> all([x in list_all(obj) for x in [1, 2, 3, 4, 5, 6]]) 
    True 
    >>> all ([x in [1, 2, 3, 4, 5, 6] for x in list_all(obj)]) 
    True 
    """ 
    if not isinstance(obj, list): 
     return obj 
    else: 
     return [list_all(x) for x in obj] 

當我試圖print(list_all([[2,3],[4,5]])),它打印出完全相同的輸入,這意味着代碼不會什麼都沒有。我認爲問題是[]支架,但我想不出一種方法來消除。有人可以幫忙嗎?

+5

我看不到你的代碼不能正常工作,請再具體些! – Arman

+0

剛剛編輯,對此感到抱歉 – CoolKid

+0

你在做什麼?壓扁列表清單? – purpletentacle

回答

2

這應有助於:

def list_all(obj): 
    if not isinstance(obj, list): 
     return [obj] 
    else: 
     return [item for sublist in obj for item in list_all(sublist)]   

print(list_all(1))     # Scalar 
print(list_all([[2,3],[4,5]]))  # One level 
print(list_all([[2,[3,2]],[4,5]])) # Two levels 

輸出:

[1] 
[2, 3, 4, 5] 
[2, 3, 2, 4, 5] 
+0

這會使一層嵌套變平,並且不處理頂層列表中包含一些標量值和一些子列表的情況。這對於[itertools'文檔中的'flatten'配方](https://docs.python.org/3/library/itertools.html#itertools-recipes)並不是一個有意義的改進。唯一的區別是它不加修改地返回標量。 – ShadowRanger

+0

@ShadowRanger我不同意。該示例已經顯示了兩層嵌套。 – purpletentacle

+0

mtk99,我不明白downvote。對我來說看起來很好,我會投票決定你的解決方案。如果不對,人們應該在這裏解釋。 – danihp

0

像這樣的事情,很抱歉沒有測試過,但實在是微不足道....

def list_all(obj): 

    result= [] 
    if not isinstance(obj, list): 
     result.append(obj) 
    else: 
     for x in obj: 
      result += list_all(x) 
    return result 
1

而不是建造一幫中間的list s,請考慮使用生成器函數。特別是在Python 3.3+,代碼很簡單:

def flatten_lists(items): 
    if isinstance(items, list): 
     for x in items: 
      yield from flatten_lists(x) 
    else: 
     yield items 

如果需要的最終結果是一個list,你可以讓來電者在list()包裹自己,或者你定義一個包裝調用發電機和轉換它的list他們:

def list_all(items): 
    return list(flatten_lists(items)) 

這大大降低了參與創建並與基於非發電解決方案的所有中間list S的處置分配器流失。

例子:

>>> list_all([1, [2, [3, [4, 5], 6]]]) 
[1, 2, 3, 4, 5, 6]