惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
腾讯CDC
J
Java Code Geeks
博客园 - 【当耐特】
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
云风的 BLOG
云风的 BLOG
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
U
Unit 42
雷峰网
雷峰网
B
Blog RSS Feed
博客园_首页
量子位
F
Fortinet All Blogs
罗磊的独立博客
H
Hackread – Cybersecurity News, Data Breaches, AI and More
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Check Point Blog

晚花行乐

马克卡尼在2026年达沃斯论坛上的讲话(阅读材料) | 晚花行乐 鸡娃如何用力才是恰到好处 | 晚花行乐 读万卷书,行万里路的辩证关系 | 晚花行乐 反对培训机构掐尖招生 | 晚花行乐 小泽和建国会谈最后10分钟全文(阅读材料) | 晚花行乐 来看看 DeepSeek 怎么鸡娃 | 晚花行乐 谈谈基本功 | 晚花行乐 惠普 ProDesk SFF PC 各系列参数对比 | 晚花行乐 解决瘦客户机上安装 Debian 12 启动失败问题 | 晚花行乐 意拾喻言:老外写的文言文 | 晚花行乐 笠翁对韵中的典故(十三元) | 晚花行乐 谈谈中考取消四小门 | 晚花行乐 亚马逊云科技产品免费试用攻略(3) - 对象存储服务 | 晚花行乐 在 Windows 10 LTSC 版本上安装 WSL2 | 晚花行乐 Debian 12 的常用配置项 | 晚花行乐 在 Debian 12 上安装 Nvidia 显卡驱动程序 | 晚花行乐 解决 Debian 12 关机失败问题 | 晚花行乐 解决 VS Code 自动更新版本后卡在连接界面 | 晚花行乐 观看巴黎奥运会有感 | 晚花行乐 在 Windows10 上安装惠普旧打印机驱动程序 | 晚花行乐 欢迎关注公众号:晚花行乐 | 晚花行乐 如何编写拼写检查器 | 晚花行乐 亚马逊云科技产品免费试用攻略(2) - 云服务器 | 晚花行乐 Pandas 中 axis 参数的理解(附实例) | 晚花行乐 我打算命个名,叫什么什么 Manager | 晚花行乐 上海武康路历史建筑一览 | 晚花行乐 Python 实现简单的数学表达式解析并处理 | 晚花行乐 观看马拉松的感悟 | 晚花行乐 Python 保存 Cookies 到文件并再次读取 | 晚花行乐 如何为 Hugo 静态网站添加评论功能 | 晚花行乐
Python 展开多层嵌套的列表 | 晚花行乐
2018-04-24 · via 晚花行乐

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

各位读后有什么想法,请在下方留言吧!如果对本文有疑问或者寻求合作,欢迎 联系邮箱邮箱已到剪贴板

精彩评论