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

posted @ 2020-04-13 10:16  songbiao  阅读(10035)  评论(0编辑  收藏  举报