首页 >后端开发 >Python教程 >Python 生成器如何有效地展平任意嵌套列表?

Python 生成器如何有效地展平任意嵌套列表?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-21 15:02:09691浏览

How Can Python Generators Efficiently Flatten Arbitrarily Nested Lists?

使用 Python 生成器展平不规则列表

展平任意嵌套的列表列表的问题很常见,但现有的解决方案经常因深度问题而失败嵌套结构。特别是,像 [[[1, 2, 3], [4, 5]], 6] 这样的列表无法使用大多数解决方案进行展平。

以下函数基于另一个问题的解决方案,可以有效地展平此类列表:

def flatten(x):
    result = []
    for el in x:
        if hasattr(el, "__iter__") and not isinstance(el, basestring):
            result.extend(flatten(el))
        else:
            result.append(el)
    return result

但是,虽然此函数有效,但可以使用生成器在可读性和性能方面进行改进

带有可迭代 ABC 的 Python 2

from collections import Iterable

def flatten(xs):
    for x in xs:
        if isinstance(x, Iterable) and not isinstance(x, basestring):
            for item in flatten(x):
                yield item
        else:
            yield x

带有可迭代 ABC 和 Yield From 的 Python 3

from collections.abc import Iterable

def flatten(xs):
    for x in xs:
        if isinstance(x, Iterable) and not isinstance(x, (str, bytes)):
            yield from flatten(x)
        else:
            yield x

这些基于生成器的解决方案提供了一种更简洁、更有效的方法来展平不规则列表。它们的工作原理是迭代列表中的每个元素并递归地生成子列表的元素。任何不可迭代的元素(例如数字或字符串)都会立即生成。

以上是Python 生成器如何有效地展平任意嵌套列表?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn