python 展开嵌套列表
Posted songbiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于python 展开嵌套列表的主要内容,如果未能解决你的问题,请参考以下文章