python 展開嵌套列表


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM