Python 如何展开嵌套的序列


Posted in Python onAugust 01, 2020

问题

你想将一个多层嵌套的序列展开成一个单层列表

解决方案

可以写一个包含 yield from 语句的递归生成器来轻松解决这个问题。比如:

from collections import Iterable

def flatten(items, ignore_types=(str, bytes)):
  for x in items:
    if isinstance(x, Iterable) and not isinstance(x, ignore_types):
      yield from flatten(x)
    else:
      yield x

items = [1, 2, [3, 4, [5, 6], 7], 8]
# Produces 1 2 3 4 5 6 7 8
for x in flatten(items):
  print(x)

在上面代码中, isinstance(x, Iterable) 检查某个元素是否是可迭代的。 如果是的话, yield from 就会返回所有子例程的值。最终返回结果就是一个没有嵌套的简单序列了。

额外的参数 ignore_types 和检测语句 isinstance(x, ignore_types) 用来将字符串和字节排除在可迭代对象外,防止将它们再展开成单个的字符。 这样的话字符串数组就能最终返回我们所期望的结果了。比如:

>>> items = ['Dave', 'Paula', ['Thomas', 'Lewis']]
>>> for x in flatten(items):
...   print(x)
...
Dave
Paula
Thomas
Lewis
>>>

讨论

语句 yield from 在你想在生成器中调用其他生成器作为子例程的时候非常有用。 如果你不使用它的话,那么就必须写额外的 for 循环了。比如:

def flatten(items, ignore_types=(str, bytes)):
  for x in items:
    if isinstance(x, Iterable) and not isinstance(x, ignore_types):
      for i in flatten(x):
        yield i
    else:
      yield x

尽管只改了一点点,但是 yield from 语句看上去感觉更好,并且也使得代码更简洁清爽。

之前提到的对于字符串和字节的额外检查是为了防止将它们再展开成单个字符。 如果还有其他你不想展开的类型,修改参数 ignore_types 即可。

最后要注意的一点是, yield from 在涉及到基于协程和生成器的并发编程中扮演着更加重要的角色。

以上就是Python 如何展开嵌套的序列的详细内容,更多关于Python 展开嵌套的序列的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python抓取百度首页的方法
May 19 Python
python实现分页效果
Oct 25 Python
Python深度优先算法生成迷宫
Jan 22 Python
python 读取DICOM头文件的实例
May 07 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
PyQt5组件读取参数的实例
Jun 25 Python
python 返回一个列表中第二大的数方法
Jul 09 Python
Python 获取 datax 执行结果保存到数据库的方法
Jul 11 Python
使用Python实现 学生学籍管理系统
Nov 26 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
Python调用C语言程序方法解析
Jul 07 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 Python
Python 日期与时间转换的方法
Aug 01 #Python
Python 执行矩阵与线性代数运算
Aug 01 #Python
Python实现数字的格式化输出
Aug 01 #Python
Python实现一个简单的递归下降分析器
Aug 01 #Python
Python 如何在字符串中插入变量
Aug 01 #Python
Python打印不合法的文件名
Jul 31 #Python
Django+Uwsgi+Nginx如何实现生产环境部署
Jul 31 #Python
You might like
php+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
php解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
一个简单且很好用的php分页类
2013/10/26 PHP
codeigniter自带数据库类使用方法说明
2014/03/25 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
Jquery升级新版本后选择器的语法问题
2010/06/02 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
jQuery控制iFrame(实例代码)
2013/11/19 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
JS中关于事件处理函数名后面是否带括号的问题
2016/11/16 Javascript
[原创]JS基于FileSaver.js插件实现文件保存功能示例
2016/12/08 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
jQuery发请求传输中文参数乱码问题的解决方案
2018/05/22 jQuery
JQuery中queue方法用法示例
2019/01/31 jQuery
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
在 Vue 中使用 JSX 及使用它的原因浅析
2020/02/10 Javascript
Python中的tuple元组详细介绍
2015/02/02 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
python函数的5种参数详解
2017/02/24 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
Python3 max()函数基础用法
2019/02/19 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
详解Python遍历列表时删除元素的正确做法
2021/01/07 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
经典广告词大全
2014/03/14 职场文书
建筑学专业自荐书
2014/07/09 职场文书
法定代表人证明书
2014/11/28 职场文书
JavaScript实现外溢动态爱心的效果的示例代码
2022/03/21 Javascript
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技