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中的异常处理相关语句基础学习笔记
Jul 11 Python
Python极简代码实现杨辉三角示例代码
Nov 15 Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 Python
python中Switch/Case实现的示例代码
Nov 09 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
基于python 微信小程序之获取已存在模板消息列表
Aug 05 Python
python之列表推导式的用法
Nov 29 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
Python读取xlsx数据生成图标代码实例
Aug 12 Python
django中ImageField的使用详解
Dec 21 Python
详解用selenium来下载小姐姐图片并保存
Jan 26 Python
Python如何识别银行卡卡号?
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
Cannot modify header information错误解决方法
2008/10/08 PHP
PHP nl2br函数 将换行字符转成 <br>
2009/08/21 PHP
PHP 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
2020/04/13 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
use jscript List Installed Software
2007/06/11 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
整理 node-sass 安装失败的原因及解决办法(小结)
2020/02/19 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
[37:29]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.19
2020/11/19 DOTA
Python基于pandas实现json格式转换成dataframe的方法
2018/06/22 Python
解决Python3下map函数的显示问题
2019/12/04 Python
Tensorflow使用Anaconda、pycharm安装记录
2020/07/29 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
玩具反斗城天猫官方旗舰店:享誉全球的玩具店
2017/10/10 全球购物
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
计算机求职信
2013/12/01 职场文书
长辈证婚人证婚词
2014/01/09 职场文书
青春励志演讲稿
2014/04/29 职场文书
改革共识倡议书
2014/08/29 职场文书
蜗居观后感
2015/06/11 职场文书
2015年度学校应急管理工作总结
2015/10/22 职场文书
数学复习课教学反思
2016/02/18 职场文书
调解协议书范本
2016/03/21 职场文书
2016年少先队活动总结
2016/04/06 职场文书