python 展開嵌套列表
引言
Python中的列表還可以將不同數據類型的項放在一個列表中。所以,一個嵌套的列表就是是一個包含多個列表的列表,例如[1,2,[3],[4,[5,6]]。
通常,我們需要將這些嵌套列表轉換為平面列表(flatted a nested list),以便對數據執行常規列表操作。
方法1,創建遞歸函數
首先介紹,python中對一個嵌套的list,和一個空列表[],進行sum()函數運算時,可以實現展開列表。
>>> list_1 = [[1,2],[3]]
>>> sum(list_1, [])
[1, 2, 3]
於是,結合遞歸原理,可以創建展平嵌套列表的函數如下:
def flatten(li):
return sum(([x] if not isinstance(x, list) else flatten(x) for x in li), [])
>>> list_1 = [1, 2, [3], [4, [5, 6]]]
>>> print(flatten(list_1))
[1, 2, 3, 4, 5, 6]
方法2,使用列表推導式
>>> li = [[14], [215, 383, 87], [298], [374], [2, 3, 4, 5, 6, 7]]
>>> flat_list = [item for sublist in li for item in sublist]
>>> print(flat_list)
[14, 215, 383, 87, 298, 374, 2, 3, 4, 5, 6, 7]
注意,對於嵌套的列表使用列表推導式時,兩個遍歷變量的寫法要寫正確,可以先按照邏輯寫推導式中遍歷的部分,比如,對於上面的推導式,首先按照邏輯,寫遍歷的部分是, for sublist in li ;然后繼續按照邏輯往下寫下一層遍歷, for item in sublist。最后,按照邏輯知道,遍歷到sublist中的item 就是最后要推導出來的新列表的元素,所以就在列表推導式的最前面加上item。最終組成了完整的嵌套列表的列表推導式。
還要注意的是,這種使用列表推導式展平列表的方法,要求必須是嚴格嵌套列表,也就是說列表中的每個元素都是列表,而沒有非列表的元素,比如下例就會報錯:
>>> li = [14, [215, 383, 87], [298], [374], [2, 3, 4, 5, 6, 7]]
>>> flat_list = [item for sublist in li for item in sublist]
Traceback (most recent call last):
File "<pyshell#77>", line 1, in <module>
flat_list = [item for sublist in li for item in sublist]
File "<pyshell#77>", line 1, in <listcomp>
flat_list = [item for sublist in li for item in sublist]
TypeError: 'int' object is not iterable
這個時候,第一個方法是可以正常工作的。
>>> flatten(li)
[14, 215, 383, 87, 298, 374, 2, 3, 4, 5, 6, 7]
其他的方法
其他的方法有,Flatten List using Inbuilt reduce Function ,Flatten List Using NumPy,請參考Convert Nested List To A Flat List In Python