首頁 >後端開發 >Python教學 >PYTHON壓平嵌套列表

PYTHON壓平嵌套列表

高洛峰
高洛峰原創
2017-03-03 14:05:201659瀏覽

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()]

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

其他方法:

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

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

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

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)
#对元组同样适用

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

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

以上這篇PYTHON壓平嵌套列表的簡單實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持PHP中文網。

更多PYTHON壓平嵌套列表相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn