1. ホーム
  2. python

[解決済み] 不規則なリスト群を平坦にする

2022-03-20 20:20:41

質問

はい、このテーマは以前にも取り上げられたことがありますね( こちら , こちら , こちら , こちら ) が、私の知る限り、このようなリストでは、1つを除いて、すべての解決策が失敗します。

L = [[[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

flatten(L)

これが最適なモデルなのでしょうか?何か見落としがあったのでしょうか?何か問題はありますか?

解決方法は?

ジェネレータ関数を使用すると、サンプルが少し読みやすくなり、おそらくパフォーマンスも上がります。

Python 2

def flatten(l):
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
            for sub in flatten(el):
                yield sub
        else:
            yield el

を使いました。 イテラブルABC 2.6で追加された

Python 3

Python 3 では basestring はもうありませんが、タプルの strbytes を使えば、そこで同じ効果を得ることができます。

は、その yield from 演算子は、ジェネレータから一度にひとつずつ項目を返します。これは サブジェネレータに委ねるための構文 は 3.3 で追加されました。

from collections.abc import Iterable

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