本文将讨论:如果有一个多维列表 List,也就是多层嵌套(nested)的关系,如何提取列表的所有元素,将高维度的列表转化为一维列表?
背景
有些列表的元素是多层嵌套(nested)在子列表里,并且深度未知,比如
[1, 'a', ['b', ['c'], [ ], [3, 4]]]
本文介绍将这种列表由二维或者更高维转化到一维(也叫展平,flatten)的方法,即希望最终得到这样的结果:
1, a, b, c, 3, 4
已知嵌套层数
如果明确知道嵌套列表的层级,那么可以用 Python 多重列表解析里for的顺序 里的方法,使用列表解析或者多重循环的方法展平。
未知嵌套层数
这是更为通用的方法,需要用递归的方法,可以参考这篇 Python 用递归生成器计算笛卡尔积
假如我们把函数叫做
def 展开(任意序列)
具体定义是这样的:
def 展开(任意序列):
对于 任意序列 里的 每一项:
如果 仍然是序列:
给出(yield)展开(这个序列) 里的每一项
否则:
给出(yield)这一项
写成 Python 代码就是:
def flatten(sequence):
for item in sequence:
if type(item) is list:
for subitem in flatten(item):
yield subitem
else:
yield item
a = [1, 'a', ['b', ['c'], [ ], [3, 4]]]
for x in flatten(a):
print x,
用列表解析实现
是使用 List comprehension 和 lambda 匿名函数的方法,将上面的递归式写在一行以内。
flatten = lambda x: [subitem for item in x for subitem in flatten(item)] \
if type(x) is list else [x]
a = [1, 'a', ['b', ['c'], [ ], [3, 4]]]
for x in flatten(a):
print x,
最终的运行结果是:
1 a b c 3 4
用 reduce 实现
如果你使用 Python3,由于 reduce 函数在Python3 里不再是全局函数,所以使用之前需要先引入
from functools import reduce
比如:一个二维数组降维到一维,可以像下面这么写:
reduce(lambda x,y:x+y,[[1,2],[3,4]])
得到的结果是:
[1, 2, 3, 4]
如果您对本文有疑问或者寻求合作,欢迎 联系邮箱 。邮箱已到剪贴板
标签: PYTHON
给个免费的赞吧~
精彩评论
本站 是个人网站,采用 署名协议 CC-BY-NC 授权。
欢迎转载,请保留原文链接 https://www.lfhacks.com/tech/python-flatten-sub-sequence/ ,且不得用于商业用途。