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的Django中将文件上传至七牛云存储的代码分享
Jun 03 Python
Python实现求解一元二次方程的方法示例
Jun 20 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
对pyqt5多线程正确的开启姿势详解
Jun 14 Python
python判断一个对象是否可迭代的例子
Jul 22 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
Python定时器线程池原理详解
Feb 26 Python
Python3实现飞机大战游戏
Apr 24 Python
Python flask框架如何显示图像到web页面
Jun 03 Python
Python datetime模块使用方法小结
Jun 18 Python
python如何写try语句
Jul 14 Python
python如何爬取网页中的文字
Jul 28 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 模拟get_headers函数的代码示例
2013/04/27 PHP
PHP反射机制用法实例
2014/08/28 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
PHP实现简单的计算器
2020/08/28 PHP
js中for in的用法示例解析
2013/12/25 Javascript
一个非常全面的javascript URL解析函数和分段URL解析方法
2014/04/12 Javascript
js统计页面的来访次数实现代码
2014/05/09 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
2015/11/29 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
vue vantUI tab切换时 list组件不触发load事件的问题及解决方法
2020/02/14 Javascript
vue请求数据的三种方式
2020/03/04 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
[59:53]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第二场 3月6日
2021/03/11 DOTA
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
Python字符编码与函数的基本使用方法
2017/09/30 Python
Python 隐藏输入密码时屏幕回显的实例
2019/02/19 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
Python socket处理client连接过程解析
2020/03/18 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
英国领先的在线高尔夫设备零售商:Golfgeardirect
2020/12/11 全球购物
财务工作者先进事迹材料
2014/01/17 职场文书
《识字五》教学反思
2014/03/01 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
保管员岗位职责
2015/02/14 职场文书
小学生纪律委员竞选稿
2015/11/19 职场文书
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS