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使用BeautifulSoup库解析HTML基本使用教程
Mar 31 Python
python 捕获 shell/bash 脚本的输出结果实例
Jan 04 Python
python3中函数参数的四种简单用法
Jul 09 Python
Python线程之定位与销毁的实现
Feb 17 Python
python实现几种归一化方法(Normalization Method)
Jul 31 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
pymysql的简单封装代码实例
Jan 08 Python
python3爬取torrent种子链接实例
Jan 16 Python
django 读取图片到页面实例
Mar 27 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
Jun 04 Python
Python如何输出百分比
Jul 31 Python
python库Tsmoothie模块数据平滑化异常点抓取
Jun 10 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
将OICQ数据转成MYSQL数据
2006/10/09 PHP
服务器web工具 php环境下
2010/12/29 PHP
解析php中static,const与define的使用区别
2013/06/18 PHP
PHP合并静态文件详解
2014/11/14 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
JavaScript isArray()函数判断对象类型的种种方法
2010/10/11 Javascript
js中parseFloat(参数1,参数2)定义和用法及注意事项
2013/01/27 Javascript
js 文本滚动效果的实例代码
2013/08/17 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
2019/12/17 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
Python日志模块logging简介
2015/04/13 Python
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
Python中 map()函数的用法详解
2018/07/10 Python
python 不同方式读取文件速度不同的实例
2018/11/09 Python
pygame游戏之旅 添加游戏介绍
2018/11/20 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
python实现测试工具(二)——简单的ui测试工具
2020/10/19 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
大学校园生活自我鉴定
2014/01/13 职场文书
鉴定评语大全
2014/05/05 职场文书
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle