美文网首页
Python3 - 展开嵌套的序列

Python3 - 展开嵌套的序列

作者: 惑也 | 来源:发表于2018-12-22 13:51 被阅读35次

问题

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

解决方案

可以写一个包含 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]
for x in flatten(items):
    print(x, end = ' ')

示例代码中,isinstance(x, Iterable) 检查元素是否可迭代的。 如果是的话, yield from 就会返回所有子示例的元素。最终返回结果就是一个没有嵌套的简单序列。

参数 ignore_types 和检测语句 isinstance(x, ignore_types) 用来将字符串和字节排除在可迭代对象外,防止将它们再展开成单个的字符。

讨论

语句 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 语句,使得代码更简洁。

相关文章

  • Python3 - 展开嵌套的序列

    问题 将一个多层嵌套的序列展开成一个单层列表 解决方案 可以写一个包含 yield from 语句的递归生成器来轻...

  • Python 如何展开嵌套的序列

    问题[https://www.bilibili.com/video/BV1LZ4y1H75S] 你想将一个多层嵌套...

  • 【2017-09-27】迭代器与生成器(五)

    展开嵌套序列yield from运用yield from iterable本质上等于for item in ite...

  • markdown test

    一级标题 二级标题 三级标题 嵌套列表嵌套列表嵌套列表嵌套列表嵌套列表嵌套列表 无序列表 无序列表 有序列表1 有...

  • Flink SQL 自定义 format

    1.背景 由于 kafka 中的 json 属于嵌套,又不想二次序列化再把它展开,故自定义 format。 2.步...

  • html-列表(任务1-作业2)

    作业要求: 思路: 考察有序列表,无序列表,以及列表的嵌套 最外层是一个无序列表,里边有两个 ,每个 里边嵌套...

  • python--嵌套序列

    python 嵌套序列 嵌套序列:是由一组等长列表组成的列表。 numpy可以对数据进行类型转换, 统计转成字符型,,

  • 嵌套

    方便统一添加效果,本质上是序列的映射序列 1,选中时间轴上所有素材,右键,选择嵌套,得到嵌套序列,统一添加效果或修...

  • yield from

    问题 你想将一个多层嵌套的序列展开成一个单层列表 解决方案 可以写一个包含 yield from 语句的递归生成器...

  • Python快速精通2 - 序列,字典代码部分

    Python3基础2:序列(列表,元组)与字典 (一)序列通用方法 序列封包 本质上: 变量 < - - 元组看下...

网友评论

      本文标题:Python3 - 展开嵌套的序列

      本文链接:https://www.haomeiwen.com/subject/wkeikqtx.html