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实现计算资源图标crc值的方法
Oct 05 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
pyenv与virtualenv安装实现python多版本多项目管理
Aug 17 Python
Python 共享变量加锁、释放详解
Aug 28 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
Python求两个字符串最长公共子序列代码实例
Mar 05 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
Apr 13 Python
Python内置异常类型全面汇总
May 28 Python
python suds访问webservice服务实现
Jun 26 Python
通过实例简单了解Python sys.argv[]使用方法
Aug 04 Python
如何使用Pytorch搭建模型
Oct 26 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
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
php中DOMElement操作xml文档实例演示
2013/03/26 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
JavaScript基于replace+正则实现ES6的字符串模版功能
2017/04/25 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
vue 的点击事件获取当前点击的元素方法
2018/09/15 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
layUI使用layer.open,在content打开数据表格,获取值并返回的方法
2019/09/26 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
jquery实现拖拽小方块效果
2020/12/10 jQuery
Python提取网页中超链接的方法
2016/09/18 Python
python 处理数字,把大于上限的数字置零实现方法
2019/01/28 Python
通过python爬虫赚钱的方法
2019/01/29 Python
python实现电子词典
2020/03/03 Python
python爬取音频下载的示例代码
2020/10/19 Python
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
职工运动会邀请函
2014/02/02 职场文书
会计专业求职信范文
2014/03/16 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
校庆活动策划方案
2014/06/05 职场文书
2014年协会工作总结
2014/11/22 职场文书
公司辞职信模板
2015/05/13 职场文书
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技