如果有一個列表嵌套列表的數(shù)據(jù)結(jié)構(gòu)饲窿,形如:
[1,2,3,4,[1,2,[1,4,6,8]],7]
現(xiàn)在我們想把它展平:
[1, 2, 3, 4, 1, 2, 1, 4, 6, 8, 7]
通常的做法是:
利用層次遞歸來實現(xiàn),但是這樣也有缺陷:需要把儲存結(jié)果的列表作為參數(shù)不停遞歸傳入廓脆。
占用內(nèi)存太大之宿。
解決方案
可以采用生成器來解決
輸出結(jié)果
besides
其中, yield from是從Python 3.3開始引入的寫法:
yield from x
等價于
for g in x:
yield g
所以鸠窗,當(dāng)代碼運行到
[x for x in solution._flat(aList))]
時妓羊,每一次循環(huán)都會進(jìn)入到 flat生成器里面。在 flat里面稍计,對傳入的參數(shù)使用for循環(huán)進(jìn)行迭代躁绸,如果拿到的元素不是列表,那么就直接拋出臣嚣,送到上一層净刮。如果當(dāng)前已經(jīng)是最上層了,那么就再一次拋出給外面的列表推導(dǎo)式硅则。如果當(dāng)前元素是列表淹父,那么繼續(xù)生成一個生成器,并對這個新的生成器進(jìn)行迭代怎虫,并把每一個結(jié)果繼續(xù)往上層拋出暑认。
最終,每一個數(shù)字都會被一層一層往上拋出給列表推導(dǎo)式大审,從而獲得需要的結(jié)果蘸际。
去掉from,運行結(jié)果如下:
顯然是不對的徒扶,此外粮彤,可以吧yield from換成
for x in self._flat(element):
yield x
最終結(jié)果是一樣的。