1. 程式人生 > >python壓平巢狀列表

python壓平巢狀列表

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