ホームページ >バックエンド開発 >Python チュートリアル >Python ジェネレーターはどのようにして任意にネストされたリストを効率的にフラット化できるのでしょうか?

Python ジェネレーターはどのようにして任意にネストされたリストを効率的にフラット化できるのでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-21 15:02:09720ブラウズ

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

ただし、この関数は機能しますが、ジェネレーターを使用すると読みやすさとパフォーマンスの点で改善できます。関数。

Python 2 と Iterable ABC

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

Python 3 と Iterable ABC および Yield From

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。