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 实现归并排序算法
Jun 05 Python
Python中用format函数格式化字符串的用法
Apr 08 Python
编写Python脚本批量下载DesktopNexus壁纸的教程
May 06 Python
python实现zabbix发送短信脚本
Sep 17 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
selenium+python设置爬虫代理IP的方法
Nov 29 Python
Pytorch to(device)用法
Jan 08 Python
Win10环境中如何实现python2和python3并存
Jul 20 Python
python中return不返回值的问题解析
Jul 22 Python
Python 如何反方向迭代一个序列
Jul 28 Python
python实现简单的井字棋游戏(gui界面)
Jan 22 Python
python实现图片转字符画
Feb 19 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
smarty section简介与用法分析
2008/10/03 PHP
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
输入框过滤非数字的js代码
2014/09/18 Javascript
使用VS开发 Node.js指南
2015/01/06 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
[原创]javascript typeof id==='string'?document.getElementById(id):id解释
2016/11/02 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
详解如何在nuxt中添加proxyTable代理
2018/08/10 Javascript
vue自定义指令用法经典实例小结
2019/03/16 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
Node.js Domain 模块实例详解
2020/03/18 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
Python编码爬坑指南(必看)
2016/06/10 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
用Python将动态GIF图片倒放播放的方法
2016/11/02 Python
Python读取Json字典写入Excel表格的方法
2018/01/03 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
2019/01/29 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
python实现简单聊天室功能 可以私聊
2019/07/12 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
Python猴子补丁知识点总结
2020/01/05 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
2020/12/31 Python
基于PyTorch中view的用法说明
2021/03/03 Python
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
投资合作协议书
2014/04/17 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书