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 for 循环获取index索引的方法

    python for 循环获取index索引的方法

    今天小编就为大家分享一篇python for 循环获取index索引的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • python常用知识梳理(必看篇)

    python常用知识梳理(必看篇)

    下面小编就为大家带来一篇python常用知识梳理(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Python中字典的setdefault()方法教程

    Python中字典的setdefault()方法教程

    在学习python字典操作方法时,感觉setdefault()方法,比字典的其它基本操作方法更难理解的同学比较多,所以想着总结以下,下面这篇文章主要给大家介绍了Python中字典的setdefault()方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • python实现自动解数独小程序

    python实现自动解数独小程序

    这篇文章主要为大家详细介绍了python实现自动解数独小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 解决Spyder中图片显示太小的问题

    解决Spyder中图片显示太小的问题

    下面小编就为大家分享一篇解决Spyder中图片显示太小的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • python实现ID3决策树算法

    python实现ID3决策树算法

    这篇文章主要为大家详细介绍了python实现ID3决策树算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Python实现一个服务器监听多个客户端请求

    Python实现一个服务器监听多个客户端请求

    这篇文章主要为大家详细介绍了Python如何实现一个服务器监听多个客户端请求,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 简单实现python爬虫功能

    简单实现python爬虫功能

    这篇文章主要介绍了python实现简单爬虫功能的相关资料,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • Python FTP两个文件夹间的同步实例代码

    Python FTP两个文件夹间的同步实例代码

    本文通过实例代码给大家介绍了python ftp两个文件夹间的同步,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • python通过安装itchat包实现微信自动回复收到的春节祝福

    python通过安装itchat包实现微信自动回复收到的春节祝福

    这篇文章主要介绍了python通过安装itchat包实现微信自动回复收到的春节祝福,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-01-01

最新评论