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使用sorted函数对列表进行排序的方法
Apr 04 Python
详解Python中的文本处理
Apr 11 Python
Python使用matplotlib填充图形指定区域代码示例
Jan 16 Python
用pycharm开发django项目示例代码
Oct 24 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
python通过http下载文件的方法详解
Jul 26 Python
Python之Class&Object用法详解
Dec 25 Python
Python切割图片成九宫格的示例代码
Mar 10 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
Mar 16 Python
Python实现电视里的5毛特效实例代码详解
May 15 Python
django 模型中的计算字段实例
May 19 Python
Python在centos7.6上安装python3.9的详细教程(默认python版本为2.7.5)
Oct 15 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的实现思路和核心程序(二)
2006/10/09 PHP
php中使用Akismet防止垃圾评论的代码
2011/06/10 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
PHP如何将XML转成数组
2016/04/04 PHP
简单实用的PHP文本缓存类实例
2019/03/22 PHP
How to Auto Include a Javascript File
2007/02/02 Javascript
js注意img图片的onerror事件的分析
2011/01/01 Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
2012/07/20 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
2019/02/13 Javascript
[02:19]DOTA选手解说齐贺岁
2018/02/11 DOTA
OpenCV实现人脸识别
2017/04/07 Python
python中关于for循环的碎碎念
2017/06/30 Python
Python堆排序原理与实现方法详解
2018/05/11 Python
python关于变量名的基础知识点
2020/03/03 Python
Django admin 实现search_fields精确查询实例
2020/03/30 Python
Python实例方法、类方法、静态方法区别详解
2020/09/05 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
大学生个人总结的自我评价
2013/10/05 职场文书
班组长安全职责
2014/01/05 职场文书
《火烧云》教学反思
2014/04/12 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
会计求职信范文
2014/05/24 职场文书
庆七一活动简报
2015/07/20 职场文书
部门主管竞聘书
2015/09/15 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript
Win11如何默认打开软件界面最大化?Win11默认打开软件界面最大化的方法
2022/07/15 数码科技