python打平處理巢狀list
阿新 • • 發佈:2019-01-02
1. 巢狀list
python中巢狀的list還算比較常見的一種結構。比如我們經常用巢狀兩層的list來模擬矩陣:
>>> matrix = [[1,2,3],[4,5,6],[7,8,9]]
>>> matrix
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
很多時候我們想將這一個巢狀兩層的list變成一個list,該怎麼辦呢?對於上面的例子,我們很容易找到如下的方式就可以滿足需求:
def flatmatrix(matrix): result = [] for i in range(len(matrix)): result.extend(matrix[i]) print result matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] flatmatrix(matrix)
如果巢狀的list不是兩層結構,而是任意的形式,上面的方式就不適用了。
2.遞迴打平巢狀list
比較容易想到的是遞迴的方式處理任意形式的巢狀list。我們取遍歷原始的list,如果裡面的元素是list則遞迴,如果不是加入結果中,直到原始list的所有元素遍歷結束。具體程式碼如下:
def flat1(inputlist, result = None): if result is None: result = [] for item in inputlist: if isinstance(item, list): flat1(item, result) else: result.append(item) return result inputlist = ['it', 'is', ['a', ['test', 'of', ['circle', 'lists'], ','], 'please', 'like', ['it', 'and'], 'hello'], 'world'] print flat1(inputlist)
3.通過迴圈打平巢狀list
一般來說,遞迴的優勢是簡潔明瞭,容易理解。缺點則是需要遞迴棧,效率比較低。我們嘗試用非遞迴的方式來實現。
def flat2(inputlist): result = [] while inputlist: head = inputlist.pop(0) if isinstance(head, list): inputlist = head + inputlist else: result.append(head) return result inputlist = ['it', 'is', ['a', ['test', 'of', ['circle', 'lists'], ','], 'please', 'like', ['it', 'and'], 'hello'], 'world'] print flat2(inputlist)
迴圈的過程中,每次將輸入list的首位元素取出來然後放到原來的位置,這樣就起到了解開一層巢狀的作用,直到最後將所有的巢狀解開為止!