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

再帰を使わずにPythonでネストしたリストをフラット化する方法

再帰処理を使わずにネストされたリストをフラット化(一次元化)したい場合、lambda関数sum()メソッドmap()メソッド、そしてisinstance()メソッドを組み合わせることで実現できます。

前提知識:使用する機能の概要

Pythonのリストは、整数、浮動小数点数、文字列など、異なるデータ型の値を混在させて格納できる柔軟なデータ構造です。今回のコードを理解するために、使われている各機能を確認しておきましょう。

isinstance()メソッド

指定したオブジェクトが特定のデータ型(クラス)に属しているかどうかを判定する組み込み関数です。このプログラムでは、「対象がリストかどうか」を判別するために使用します。

lambda(無名関数)

通常、Pythonの関数はdefキーワードを使って名前付きで定義しますが、lambdaキーワードを使うと名前のない関数(無名関数)を定義できます。lambdaは単一の式を受け取り、その評価結果を返します。引数は複数取れますが、記述できる式は1つだけという制限があります。

map()関数

リストやタプルなどのイテラブル(反復可能オブジェクト)の各要素に対して、指定した関数や操作を適用します。結果としてマップオブジェクトを返します。

sum()メソッド

イテラブル内の数値を合計する関数です。第2引数に初期値(ここでは空のリスト[])を渡すことで、リスト同士を連結する用途にも応用できます。

コード例

以下に、再帰を使わずに深くネストされたリストをフラット化するコードを示します。

my_list = [[[11,[[32]],[[[53]]]],[[64],75]], [[6, 89, 99]]]
flattened_list = lambda my_list: sum(map(flattened_list,my_list),[]) if isinstance(my_list,list) else [my_list]
print("元のリスト : ")
print(my_list)
print("フラット化したリスト :")
print(flattened_list(my_list))

出力結果

元のリスト :
[[[11, [[32]], [[[53]]]], [[64], 75]], [[6, 89, 99]]]
フラット化したリスト :
[11, 32, 53, 64, 75, 6, 89, 99]

処理の流れと解説

  • まず、多次元にネストされたリストを定義し、コンソールに表示します。
  • lambda式の中では、isinstance()によって要素がリストかどうかを判定します。リストであれば、map()で自分自身(lambda)を各要素に適用し、sum()で結果を連結して平坦化します。
  • 要素がリストでなければ、その値を単一要素のリスト[my_list]として返します。
  • このように条件分岐をlambda内に組み込むことで、明示的な再帰関数を定義せずに、ネストの深さに関係なくリストを一次元に展開できます。
  • 最終的な結果は変数に代入され、コンソールに出力されます。

なお、この手法は簡潔ですが、非常に深いネスト構造では可読性が低下する場合があります。実務ではitertools.chainやジェネレータ式なども検討するとよいでしょう。

  1. Pythonで再帰を使って文字列を反転させるプログラムの書き方

    再帰(リカージョン)の手法を使って文字列を逆順に並べ替えたい場合は、ユーザー定義の関数を再帰と組み合わせて実装します。再帰とは、大きな問題をより小さな単位に分割してそれぞれの結果を計算し、それらを組み合わせることで最終的な答えを導き出す手法です。文字列の反転においても、この考え方をそのまま応用できます。コード例以下に実際のプログラム例を示します。def reverse_string(my_string):    if len(my_string) == 0:        r

  2. Pythonでタプルのリストを文字列にフラット化する方法

    はじめにPythonでタプルのリスト(リスト内に含まれる複数のタプル)を文字列形式にフラット化したい場合、str関数とstripメソッドを組み合わせることで簡単に実現できます。まず前提として、リストは整数・浮動小数点数・文字列など、さまざまなデータ型の値を混在させて格納できる柔軟なデータ構造です。タプルのリストとは、リストの中に複数のタプルが格納されている状態を指します。strip() メソッド: 文字列の先頭と末尾から、指定した特定の文字を取り除きます。str() 関数: 引数として渡されたデータを文字列型に変換します。以下に具体的な実装例を示します。サンプルコードmy_list = [(1