1. 程式人生 > >python打平處理巢狀list

python打平處理巢狀list

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的首位元素取出來然後放到原來的位置,這樣就起到了解開一層巢狀的作用,直到最後將所有的巢狀解開為止!