Python壓平嵌套列表

來源:互聯網
上載者:User

list 是 Python 中使用最頻繁的資料類型, 標準庫裡面有豐富的函數可以使用。
不過,如果把多維列錶轉換成一維列表(不知道這種需求多不多),還真不容易找到好用的函數,
要知道Ruby、Mathematica、Groovy中可是有flatten的啊。
如果列表是維度少的、規則的,還算好辦
例如:

li=[[1,2],[3,4],[5,6]]print [j for i in li for j in i]#orfrom itertools import chainprint list(chain(*li))#ora=[[1,2],[3,4],[5,6]]t=[][t.extend(i) for i in a]print t#orprint sum(li,[])

對於複雜一些的,如:li=[1,[2],[[3]],[[4,[5],6]]],上面的方法就不好使了,得換個方法了,
從結構上看像是樹狀的,很容易聯想到了目錄的遍曆,於是就有了下面的做法:

def flat(tree):    res = []    for i in tree:        if isinstance(i, list):            res.extend(flat(i))        else:            res.append(i)    return res

另一種思路,嵌套列表無非就是有很多成對的方括弧,一維的列表只有一對,把中間的去掉就行了,轉換為字串就好辦了

def flatten(seq):    s=str(seq).replace('[', '').replace(']', '') #當然也可以用正則    return [eval(x) for x in s.split(',') if x.strip()]

不過,這種做法對於列表中出現包含"["或"]"的字串時就無能為力了,需要改進.

其他方法:

國外某論壇上見到的,同樣是遞迴,一行搞定

flat=lambda L: sum(map(flat,L),[]) if isinstance(L,list) else [L]

下面這個方法用到Tkinter模組,在郵件清單看到的方法。估計很多同學還不知道它能辦到吧,也算是python內建。注意,windows版的python都內建Tkinter模組的,linux預設則沒有

from Tkinter import _flattenli=reduce(lambda *x:list(x),range(2,6),[1])print liprint _flatten(li)#Out:#[[[[[1], 2], 3], 4], 5]#(1, 2, 3, 4, 5)#對元組同樣適用

 

還有一些第三方模組提供這樣的功能,如sympy、numpy、pipe等

對於嵌套的元組,無需多說了吧,只需稍加改動就可以了

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.