国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

PYTHON壓平嵌套列表的簡單實現(xiàn)

2019-11-25 16:44:44
字體:
供稿:網(wǎng)友

list 是 Python 中使用最頻繁的數(shù)據(jù)類型, 標(biāo)準(zhǔn)庫里面有豐富的函數(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]#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,[])

對于復(fù)雜一些的,如:li=[1,[2],[[3]],[[4,[5],6]]],上面的方法就不好使了,得換個方法了,
從結(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

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

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

不過,這種做法對于列表中出現(xiàn)包含"["或"]"的字符串時就無能為力了,需要改進(jìn).

其他方法:

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

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

下面這個方法用到Tkinter模塊,在郵件列表看到的方法。估計很多同學(xué)還不知道它能辦到吧,也算是python自帶。注意,windows版的python都自帶Tkinter模塊的,linux默認(rèn)則沒有

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等

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

以上這篇PYTHON壓平嵌套列表的簡單實現(xiàn)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持武林網(wǎng)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 嘉兴市| 嵊州市| 彰化市| 岐山县| 澄迈县| 宁南县| 隆子县| 兴仁县| 涿州市| 临邑县| 马龙县| 梨树县| 安陆市| 盐津县| 海口市| 含山县| 乡城县| 西平县| 阿巴嘎旗| 互助| 绵阳市| 方山县| 珠海市| 塔河县| 喀喇沁旗| 延安市| 蕉岭县| 蒲江县| 乌兰察布市| 洪泽县| 兴宁市| 秭归县| 芜湖县| 黑山县| 吉隆县| 大连市| 永善县| 张掖市| 五莲县| 于田县| 台北市|