2010-07-03 45 views
0

可能重複:
Flatten (an irregular) list of lists in Python壓扁在Python混合列表(含iterables和noniterables)

我怎麼會去壓扁Python中同時包含iterables和noniterables列表,例如作爲[1,[2,3,4],5,[6]]?結果應該是[1,2,3,4,5,6],列表(等等)的列表肯定不會發生。

我已經嘗試過使用itertools.chain等,但他們似乎只能在清單列表上工作。幫幫我!

+0

@KennyTM,no:Q是專門關於任意嵌套的列表,而這個人想要下降不超過一個級別 - 非常不同的問題,對於這個問題遞歸(或遞歸消除)將是非常不合適的簡單的迭代是好的,看我的A. – 2010-07-03 21:33:17

回答

1

所以你只想平坦化1或2個層次,而不是遞歸到更深層次;並且只能在列表中,而不是其他迭代,比如字符串,元組,陣列......我是否確定了你的規格?好的,如果是的話,那麼...:

def flat2gen(alist): 
    for item in alist: 
    if isinstance(item, list): 
     for subitem in item: yield subitem 
    else: 
     yield item 

如果你想要一個列表結果,list(flat2gen(mylist))會產生它。

希望這對你來說很容易適應,如果你的實際規格細微差別!

+0

完美;謝謝!有時間的初步試驗表明,它可能是一個觸動太慢,但我看到情況很少。 – 2010-07-03 21:50:00

+0

@etotheipi,什麼是典型的,有意義的「基準'alist'」爲你的應用程序,你得到什麼時間(以及在什麼平臺上)以及哪些更好?有可能以多種方式進行調整和優化,但不是在真空中,所以這些都是必需的(理想情況下在一個新的問題中,以便允許寬敞的A的答案,而不是一個擠塞的評論線程;也理想地與一些典型的「基準」alist's,不僅僅是1)。 – 2010-07-03 21:54:44

+0

不介意我說的 - 我沒有改變timeit的單位,我錯誤地認爲這個函數太慢了(doh!)。實際上,我的機器上大約需要56微秒的時間來通過比實際大小的輸入(最多8-10個項目)大15倍的輸入咀嚼,所以這正是我所需要的。再次感謝! – 2010-07-03 21:58:33