Pythonで再帰を使ってネストされたリストをフラット化する方法を解説
ネストされたリスト(入れ子構造のリスト)を1次元のリストへ平坦化することは、データ処理の場面でよく求められる操作です。Pythonでは、再帰処理とシンプルなインデックス操作、そして組み込み関数「isinstance」を組み合わせることで、任意の深さのネストに対応したフラット化が実現できます。
再帰とは、大きな問題をより小さな部分問題に分解し、それぞれの結果を組み合わせて全体の答えを導き出す手法です。リストの先頭要素だけを処理し、残りの部分に対して同じ処理を繰り返し適用することで、どれほど深く入れ子になったリストでも確実に平坦化できます。
サンプルコード
以下に、実際のコード例を示します。
def flatten_list(my_list):
if my_list == []:
return my_list
if isinstance(my_list[0], list):
return flatten_list(my_list[0]) + flatten_list(my_list[1:])
return my_list[:1] + flatten_list(my_list[1:])
my_list = [[1,2],[3,4], [90, 11], [56, 78], [[34,56]]]
print("The list is :")
print(my_list)
print("The list after flattening is : ")
print(flatten_list(my_list))
実行結果
The list is : [[1, 2], [3, 4], [90, 11], [56, 78], [[34, 56]]] The list after flattening is : [1, 2, 3, 4, 90, 11, 56, 78, 34, 56]
コードの解説
- まず、「flatten_list」という名前の関数を定義し、引数としてリストを受け取ります。
- 関数内では、リストの先頭要素のデータ型を「isinstance」で判定します。
- 先頭要素がリスト型だった場合は、その要素を再帰的にフラット化した結果と、2番目以降の要素を再帰的に処理した結果を連結して返します。
- この処理を繰り返すことで、ネストされたリスト全体が徐々に平坦化されていきます。
- 先頭要素がリスト以外の場合は、その要素をそのまま残し、残りのリストに対する再帰処理の結果と連結して返します。
- 関数の外側では、ネストされたリストを定義し、コンソールに表示しています。
- 最後に、定義した関数にリストを引数として渡して呼び出し、フラット化された結果を出力します。
補足:再帰の動作イメージと注意点
このプログラムでは、リストの先頭から順に要素を取り出して判定するため、[[34,56]] のように二重以上に入れ子になった要素も、再帰呼び出しが繰り返されることで完全に展開されます。空のリストに到達した時点で再帰が終了し、各段階の結果が連結されて最終的な1次元リストが完成します。
なお、非常に深いネストや大量のデータを扱う場合、Pythonの再帰呼び出しには上限(デフォルトで約1000回)がある点に注意が必要です。そのようなケースでは、スタックを使った反復処理や itertools を活用した別のアプローチを検討するとよいでしょう。
-
Pythonで2次元リストをフラット化する5つの方法を徹底解説
Pythonのリストは順序付けられたミュータブルなコレクションで、角括弧 [] を使って定義します。要素にはインデックス番号でアクセスでき、負のインデックス(-1 が最後の要素)を使えば末尾から参照することも可能です。 「フラット化」とは、[[1, 2, 3], [3, 6, 7], [7, 5, 4]] のような2次元リスト(ネストしたリスト)を、[1, 2, 3, 3, 6, 7, 7, 5, 4] のような1次元リストへ変換する操作のことです。本記事では、Pythonで2次元リストをフラット化する代表的な5つの方法を、コード例と実行結果とあわせて解説します。 方法1:itertools.
-
Pythonでネストされたリストをフラット化するイテレータの実装方法
整数が入れ子になったリスト(ネストされたリスト)があるとします。このリストを平坦化(フラット化)するためのイテレータを実装する必要があります。各要素は整数、またはリストのいずれかであり、そのリストの要素もまた整数や別のリストである可能性があります。例えば、入力が [[1, 1], 2, [1, 1]] の場合、出力は [1, 1, 2, 1, 1] のようになります。解決のアプローチこの問題を解くためには、以下の手順に従います。初期化処理: コンストラクタでネストされたリストを受け取り、結果を格納するための空のリスト res とインデックス index = 0 を用意し、再帰関数 getVal