不規則な(任意にネストされた)リストのリストをフラット化する 質問する

不規則な(任意にネストされた)リストのリストをフラット化する 質問する

はい、このテーマは以前にも取り上げられたことがあることは知っています。

しかし、私の知る限り、1 つを除くすべてのソリューションは、[[[1, 2, 3], [4, 5]], 6]目的の出力が[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

これは最善のアプローチでしょうか? 何か見落としているのでしょうか? 何か問題がありますか?

ベストアンサー1

ジェネレータ関数を使用すると、例が読みやすくなり、パフォーマンスが向上します。

Python 2

使用方法IterableABC2.6 で追加:

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

Python3 について

Python 3では、basestringはなくなりましたが、タプルは(str, bytes)同じ効果をもたらします。また、yield from演算子はジェネレータからアイテムを 1 つずつ返します。

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

おすすめ記事