list 是 Python 中使用最頻繁的數(shù)據(jù)類型, 標(biāo)準(zhǔn)庫(kù)里面有豐富的函數(shù)可以使用。
不過,如果把多維列表轉(zhuǎn)換成一維列表(不知道這種需求多不多),還真不容易找到好用的函數(shù),
要知道Ruby、Mathematica、Groovy中可是有flatten的啊。
如果列表是維度少的、規(guī)則的,還算好辦
例如:
li=[[1,2],[3,4],[5,6]] print [j for i in li for j in i] #or from itertools import chain print list(chain(*li)) #or a=[[1,2],[3,4],[5,6]] t=[] [t.extend(i) for i in a] print t #or print sum(li,[])
對(duì)于復(fù)雜一些的,如:li=[1,[2],[[3]],[[4,[5],6]]],上面的方法就不好使了,得換個(gè)方法了,
從結(jié)構(gòu)上看像是樹狀的,很容易聯(lián)想到了目錄的遍歷,于是就有了下面的做法:
def flat(tree): res = [] for i in tree: if isinstance(i, list): res.extend(flat(i)) else: res.append(i) return res
另一種思路,嵌套列表無非就是有很多成對(duì)的方括號(hào),一維的列表只有一對(duì),把中間的去掉就行了,轉(zhuǎn)換為字符串就好辦了
def flatten(seq): s=str(seq).replace('[', '').replace(']', '') #當(dāng)然也可以用正則 return [eval(x) for x in s.split(',') if x.strip()]
不過,這種做法對(duì)于列表中出現(xiàn)包含"["或"]"的字符串時(shí)就無能為力了,需要改進(jìn).
其他方法:
國(guó)外某論壇上見到的,同樣是遞歸,一行搞定
flat=lambda L: sum(map(flat,L),[]) if isinstance(L,list) else [L]
下面這個(gè)方法用到Tkinter模塊,在郵件列表看到的方法。估計(jì)很多同學(xué)還不知道它能辦到吧,也算是python自帶。注意,windows版的python都自帶Tkinter模塊的,linux默認(rèn)則沒有
from Tkinter import _flatten li=reduce(lambda *x:list(x),range(2,6),[1]) print li print _flatten(li) #Out: #[[[[[1], 2], 3], 4], 5] #(1, 2, 3, 4, 5) #對(duì)元組同樣適用
還有一些第三方模塊提供這樣的功能,如sympy、numpy、pipe等
對(duì)于嵌套的元組,無需多說了吧,只需稍加改動(dòng)就可以了
以上這篇PYTHON壓平嵌套列表的簡(jiǎn)單實(shí)現(xiàn)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
