python壓平巢狀列表
阿新 • • 發佈:2018-12-10
list 是 Python 中使用最頻繁的資料型別, 標準庫裡面有豐富的函式可以使用。
不過,如果把多維列表轉換成一維列表(不知道這種需求多不多),還真不容易找到好用的函式,
要知道Ruby、Mathematica、Groovy中可是有flatten的啊。
如果列表是維度少的、規則的,還算好辦
例如:
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,[]))
對於複雜一些的,如: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()]
不過,這種做法對於列表中出現包含"["或"]"的字串時就無能為力了,需要改進。
出處:http://www.cnblogs.com/c-hy/archive/2012/09/21/2696703.html