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 监听salt job状态,并任务数据推送到redis中的方法
Jan 14 Python
解决Python中定时任务线程无法自动退出的问题
Feb 18 Python
详解python statistics模块及函数用法
Oct 27 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
Feb 13 Python
新手入门学习python Numpy基础操作
Mar 02 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
python mock测试的示例
Oct 19 Python
python中doctest库实例用法
Dec 31 Python
如何用python写个模板引擎
Jan 14 Python
python中子类与父类的关系基础知识点
Feb 02 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 Python
Django分页器的用法你都了解吗
May 26 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
通过文字传递创建的图形按钮
2006/10/09 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
调试代码导致IE出错的避免方法
2014/04/04 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
深入JavaScript高级程序设计之对象、数组(栈方法,队列方法,重排序方法,迭代方法)
2015/12/01 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
详解Node使用Puppeteer完成一次复杂的爬虫
2018/04/18 Javascript
VUE在for循环里面根据内容值动态的加入class值的方法
2018/08/12 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
浅谈Vue3.0之前你必须知道的TypeScript实战技巧
2019/09/11 Javascript
详解使用mocha对webpack打包的项目进行"冒烟测试"的大致流程
2020/04/27 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
Python中Collection的使用小技巧
2014/08/18 Python
利用Python开发实现简单的记事本
2016/11/15 Python
Python科学计算之Pandas详解
2017/01/15 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
2017/12/25 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
python如何求解两数的最大公约数
2018/09/27 Python
python识别文字(基于tesseract)代码实例
2019/08/24 Python
CSS3中box-shadow的用法介绍
2015/07/15 HTML / CSS
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
制药工程专业毕业生推荐信
2013/12/24 职场文书
饭店工作计划书
2014/01/10 职场文书
高中物理教学反思
2014/02/08 职场文书
大学生暑期实践感言
2014/02/26 职场文书
大学生国庆节65周年演讲稿范文
2014/09/25 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2014年污水处理厂工作总结
2014/12/19 职场文书