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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
python中的函数用法入门教程
Sep 02 Python
视觉直观感受若干常用排序算法
Apr 13 Python
详解Python nose单元测试框架的安装与使用
Dec 20 Python
python实现数据导出到excel的示例--普通格式
May 03 Python
python opencv人脸检测提取及保存方法
Aug 03 Python
使用tensorflow实现线性回归
Sep 08 Python
基于PyQt4和PySide实现输入对话框效果
Feb 27 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
python实现梯度下降法
Mar 24 Python
Django中的JWT身份验证的实现
May 07 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
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
php中array_fill函数的实例用法
2021/03/02 PHP
ExtJs之带图片的下拉列表框插件
2010/03/04 Javascript
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
2014/06/09 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
javascript获取当前的时间戳的方法汇总
2015/07/26 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
js 弹出虚拟键盘修改密码的简单实例
2016/10/10 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
详解react-router如何实现按需加载
2017/06/15 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
2017/10/18 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
angular 服务的单例模式(依赖注入模式下)详解
2018/10/22 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
Python温度转换实例分析
2018/01/17 Python
解决python3爬虫无法显示中文的问题
2018/04/12 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
python中有帮助函数吗
2020/06/19 Python
CSS3实现超慢速移动动画效果非常流畅无卡顿
2014/06/15 HTML / CSS
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
抽象类和接口的区别
2012/09/19 面试题
应届生会计求职信
2013/11/11 职场文书
家长会学生家长演讲稿
2013/12/29 职场文书
经典促销广告词大全
2014/03/19 职场文书
小学兴趣小组活动总结
2014/07/07 职场文书
竞选班干部演讲稿500字
2014/08/20 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
教师个人总结范文
2015/02/11 职场文书
酒店厨房管理制度
2015/08/06 职场文书
Java如何实现树的同构?
2021/06/22 Java/Android