一日一技:如何把多层嵌套的列表展平

简介: 一日一技:如何把多层嵌套的列表展平

摄影:产品经理

有这样一个列表套列表的数据结构:

a = [1, 2, [3, 4, [5, 6, 7], 8], 9, [10, 11]]

现在想把它变为:

b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

遇到这种问题,肯定有很多人想到用递归和循环来实现:

def flat(deep_list, result):
    for element in deep_list:
        if isinstance(element, list):
            flat(element, result)
        else:
            result.append(element)

a = [1, 2, [3, 4, [5, 6, 7], 8], 9, [10, 11]]
result = []
flat(a, result)
print(result)

这样做确实能达到目的,但是需要把储存结果的列表作为参数不停递归传入。

实际上,如果使用生成器,这个问题就会变得简单很多:

def flat(deep_list):
    for element in deep_list:
        if isinstance(element, list):
            yield from flat(element)
        else:
            yield element

a = [1, 2, [3, 4, [5, 6, 7], 8], 9, [10, 11]]
result = [x for x in flat(a)]
print(result)

在这个解法里面,使用了 yieldyieldfrom实现生成器,当我们直接对生成器进行迭代的时候,就得到了结果。

其中, yieldfrom是从Python 3.3开始引入的写法:

yield from x
# 等价于
for g in x:
    yield g

所以,当代码运行到

[x for x in flat(a)]

的时候,每一次循环都会进入到 flat生成器里面。在 flat里面,对传入的参数使用for循环进行迭代,如果拿到的元素不是列表,那么就直接抛出,送到上一层。如果当前已经是最上层了,那么就再一次抛出给外面的列表推导式。如果当前元素是列表,那么继续生成一个生成器,并对这个新的生成器进行迭代,并把每一个结果继续往上层抛出。

最终,每一个数字都会被一层一层往上抛出给列表推导式,从而获得需要的结果。


目录
相关文章
|
6月前
|
算法 前端开发
2649. 嵌套数组生成器
2649. 嵌套数组生成器
31 0
|
6月前
|
存储 小程序 程序员
嵌套的方式构建
嵌套的方式构建
27 0
|
6月前
|
前端开发
什么是嵌套路由?如何定义嵌套路由?
什么是嵌套路由?如何定义嵌套路由?
多层for循环、while示例
多层for循环、while示例
65 1
|
Python
巧用for循环嵌套结构
巧用for循环嵌套结构
94 0
|
Python
使用 yield 压平多层嵌套字典列表混合数据
使用 yield 压平多层嵌套字典列表混合数据
76 0
|
JavaScript
树形组件(可动态添加属性、无限嵌套)及递归展示tree数据
树形组件(可动态添加属性、无限嵌套)及递归展示tree数据
树形组件(可动态添加属性、无限嵌套)及递归展示tree数据
|
SQL 算法
多层嵌套子查询的unnesting算法解析
嵌套子查询的背景实践中,经常会遇到多层嵌套的SQL,并且多层嵌套之间包含有聚集函数,执行这类SQL的最简单的方法就是一层一层嵌套执行,类似于Nested Loop Join,对于外查询的每一行数据,就要将子查询执行一遍,如果子查询还有孙查询,子查询中的每一行,还要将孙查询执行一遍,……,显尔易见,这种执行方式的效率通常都比较低,尤其是当表的数据量很大时,对性能的影响非常明显。 下面是一个嵌套查询的
|
开发者
标签嵌套和并列关系|学习笔记
快速学习标签嵌套和并列关系
标签嵌套和并列关系|学习笔记
C结构中包含自己的嵌套定义
C结构中包含自己的嵌套定义
68 0