Python 如何展开嵌套的序列

 更新时间:2020年08月01日 10:17:10   作者:David Beazley  
这篇文章主要介绍了Python 如何展开嵌套的序列,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

问题

你想将一个多层嵌套的序列展开成一个单层列表

解决方案

可以写一个包含 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聚类算法之DBSACN实例分析

    Python聚类算法之DBSACN实例分析

    这篇文章主要介绍了Python聚类算法之DBSACN,结合实例形式详细分析了DBSACN算法的原理与具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • Python3 操作 MySQL 插入一条数据并返回主键 id的实例

    Python3 操作 MySQL 插入一条数据并返回主键 id的实例

    这篇文章主要介绍了Python3 操作 MySQL 插入一条数据并返回主键 id的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Jupyter Notebook的使用详解

    Jupyter Notebook的使用详解

    JupyterNotebook是一个强大的工具,可以用于数据科学和机器学习等领域的各种任务,该文章介绍了JupyterNotebook的基本使用方法,包括新建和保存Notebook,插入图像,运行代码,以及许多快捷键的使用
    2025-01-01
  • 浅析python标准库中的glob

    浅析python标准库中的glob

    glob 文件名模式匹配,不用遍历整个目录判断每个文件是不是符合。这篇文章主要介绍了python标准库中的glob的相关知识,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2020-03-03
  • python3.4中清屏的处理方法

    python3.4中清屏的处理方法

    在本篇文章里小编给大家分享的是关于python3.4中清屏的处理方法,有兴趣的朋友们可以跟着学习下。
    2020-07-07
  • Python实现文件操作帮助类的示例代码

    Python实现文件操作帮助类的示例代码

    在使用Python进行业务开发的时候,需要将一些数据保存到本地文件存储,方便后面进行数据分析展示,本文就来用Python制作一个文件操作帮助类,需要的可以参考一下
    2023-03-03
  • python几种常用功能实现代码实例

    python几种常用功能实现代码实例

    这篇文章主要介绍了python几种常用功能实现代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 教你如何使用Python下载B站视频的详细教程

    教你如何使用Python下载B站视频的详细教程

    这篇文章主要介绍了教你如何使用Python下载B站视频的详细教程,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 用Python将一个列表分割成小列表的实例讲解

    用Python将一个列表分割成小列表的实例讲解

    今天小编就为大家分享一篇用Python将一个列表分割成小列表的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Anaconda中Python虚拟环境的创建使用与删除方法详解

    Anaconda中Python虚拟环境的创建使用与删除方法详解

    这篇文章主要为大家介绍了在Anaconda环境下,创建、使用与删除Python虚拟环境的方法,具有一定的借鉴价值,需要的小伙伴可以跟随小编一起了解一下
    2023-08-08

最新评论