Python
 Computer >> コンピューター >  >> プログラミング >> Python

ネストされたリストをタプルのリストにフラット化するPythonプログラム

Pythonでは、深くネストされたリスト(入れ子構造のリスト)を、タプルだけを含むフラットなリストに変換したい場面があります。本記事では、再帰処理とisinstance関数を組み合わせて、多次元のネストされたリストをタプルのリストへ平坦化する方法を解説します。

アプローチの概要

基本的な考え方は以下の通りです。

  • リストを引数として受け取る関数を定義します。
  • リスト内の各要素に対してisinstanceメソッドを使い、その要素がリスト型かどうかを判定します。
  • 要素がリストであれば、その要素に対して同じ関数を再帰的に呼び出します。
  • リストでなければ(つまりタプルなどの値であれば)、結果用のリストに追加します。

この再帰的な処理により、どれほど深くネストされた構造でも、すべてのタプルを取り出して1つのフラットなリストにまとめることができます。

サンプルコード

以下に実際のコード例を示します。

def convert_nested_tuple(my_list):
   for elem in my_list:
      if isinstance(elem, list):
         convert_nested_tuple(elem)
      else:
         my_result.append(elem)
   return my_result

my_list = [[[(3, 62)]], [[[(57, 49)]]], [[[[(12, 99)]]]]]

print("元のリスト:")
print(my_list)

my_result = []
my_result = convert_nested_tuple(my_list)

print("変換後のリスト:")
print(my_result)

実行結果

元のリスト:
[[[(3, 62)]], [[[(57, 49)]]], [[[[(12, 99)]]]]]
変換後のリスト:
[(3, 62), (57, 49), (12, 99)]

コードの解説

  • convert_nested_tupleという名前の関数を定義し、リストをパラメータとして受け取ります。

  • forループを使って、リストの各要素を順番に走査します。

  • isinstance(elem, list)により、各要素がリスト型かどうかをチェックします。

  • 要素がリストだった場合は、その要素を引数として自分自身(関数)を再帰的に呼び出し、さらに深い階層を探索します。

  • リストではなかった場合(タプルなどの場合)は、その要素を空のリストmy_resultに追加します。

  • すべての処理が完了したら、my_resultを戻り値として返します。

  • 関数の外側では、複数階層にネストされたタプルのリストを定義し、コンソールに表示します。

  • 結果を格納するための空のリストを用意します。

  • 先ほど定義したネストされたリストを引数として関数を呼び出します。

  • 最後に、変換結果をコンソールに出力します。

補足:より汎用的な書き方

上記のコードでは結果を格納するリストmy_resultがグローバル変数になっているため、何度も呼び出すと要素が蓄積される点に注意が必要です。より安全で汎用的な実装としては、以下のように結果リストを関数内部で管理する方法が推奨されます。

def flatten_nested_list(my_list):
    result = []
    for elem in my_list:
        if isinstance(elem, list):
            result.extend(flatten_nested_list(elem))
        else:
            result.append(elem)
    return result

my_list = [[[(3, 62)]], [[[(57, 49)]]], [[[[(12, 99)]]]]]
print(flatten_nested_list(my_list))
# 出力: [(3, 62), (57, 49), (12, 99)]

このようにextendを使って再帰呼び出しの結果を結合することで、副作用のないクリーンな関数になります。ネストの深さに関わらず対応できるため、実務でも幅広く活用できるテクニックです。

  1. 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.

  2. Pythonで3Dリスト(3次元配列)を作成する方法【サンプルコード付き】

    3Dリストとは、いわゆる3次元配列のことです。本記事では、Pythonで3Dリストを作成し、その内容を整形して出力するプログラムを解説します。ここでは例として、文字列「*」を初期値とする3×2×2の3次元リストを生成しますが、仕組みを理解すれば整数など任意の要素を持つ配列にも簡単に応用できます。 3Dリストのイメージ 3次元リストは、リストの中にリスト、さらにその中にリストが入った多段構造のデータです。たとえば、3×3×2の3Dリストは次のように表現できます。 [[1,1,1],[2,2,2],[3,3,3]], [[4,4,4],[5,5,5],[6,6,6]] アルゴリズム ステップ1: