python列表的嵌套_Python 展开多层嵌套的列表

486.png

本文将讨论:如果有一个多维列表 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]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值