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中的startswith和endswith函数使用实例
Aug 25 Python
浅谈Python中的数据类型
May 05 Python
在Python中操作文件之seek()方法的使用教程
May 24 Python
Python解惑之True和False详解
Apr 24 Python
Python基于Matplotlib库简单绘制折线图的方法示例
Aug 14 Python
python读取和保存视频文件
Apr 16 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
Flask-Mail用法实例分析
Jul 21 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
利用Python实现手机短信监控通知的方法
Jul 22 Python
在python tkinter界面中添加按钮的实例
Mar 04 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
PHP daddslashes 使用方法介绍
2012/10/26 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
jQuery学习笔记之jQuery选择器的使用
2010/12/22 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
JavaScript实现x秒后自动跳转到一个页面
2013/01/03 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
jQuery Ajax 加载数据时异步显示加载动画
2016/08/01 Javascript
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
vue父组件点击触发子组件事件的实例讲解
2018/02/08 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
跟老齐学Python之??碌某?? target=
2014/09/12 Python
python实现汉诺塔递归算法经典案例
2021/03/01 Python
python调用百度语音识别api
2018/08/30 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
Python中的枚举类型示例介绍
2019/01/09 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
用Anaconda安装本地python包的方法及路径问题(图文)
2019/07/16 Python
python返回数组的索引实例
2019/11/28 Python
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
教师找工作推荐信
2013/11/23 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
求职信名称怎么写
2014/05/26 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
学生党员批评与自我批评
2014/10/15 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
PHP中->和=>的意思
2021/03/31 PHP
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL