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的发展史
Sep 26 Python
详解Python的Django框架中的中间件
Jul 24 Python
如何实现删除numpy.array中的行或列
May 08 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Mar 05 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
python的netCDF4批量处理NC格式文件的操作方法
Mar 21 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
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
PHP 判断常量,变量和函数是否存在
2009/04/26 PHP
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
利用PHP获取汉字首字母并且分组排序详解
2017/10/22 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
javascript基础知识大集锦(一) 推荐收藏
2011/01/13 Javascript
jquery数组之存放checkbox全选值示例代码
2013/12/20 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
JavaScript中Null与Undefined的区别解析
2015/06/30 Javascript
JavaScript 模块的循环加载实现方法
2015/12/13 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
BootStrap表单时间选择器详解
2017/05/09 Javascript
AngularJS中使用ngModal模态框实例
2017/05/27 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
VUE脚手架具体使用方法
2019/05/20 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
python简单实现刷新智联简历
2016/03/30 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
Python对List中的元素排序的方法
2018/04/01 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
django认证系统实现自定义权限管理的方法
2019/08/28 Python
pandas分组聚合详解
2020/04/10 Python
Python进行特征提取的示例代码
2020/10/15 Python
php优化查询foreach代码实例讲解
2021/03/24 PHP
办公室人员先进事迹
2014/01/27 职场文书
小学优秀学生评语
2014/12/29 职场文书
送给教师们,到底该如何写好教学反思?
2019/07/02 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
解析redis hash应用场景和常用命令
2021/08/04 Redis
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电