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

Pythonでネストされたリストをフラットなリストに変換する方法

ネストされたリスト(入れ子のリスト)とは、要素そのものがリストになっているリストのことです。Pythonのデータコンテナがネストされたリストである場合、各要素を個別に処理できるように、フラットなリスト(一次元のリスト)へ変換したいケースがあります。

さらに、内側の要素自体もネストされていることがあり、ネストの階層は何層にも及ぶ可能性があります。そのため、この問題には再帰(リカージョン)を用いてアプローチします。要素がリストである限り、関数を繰り返し適用してネストをたどり続け、要素がリストではなくなった時点で、その値を新しいリストに追加していきます。こうすることで、ネストされていないすべての要素を格納したフラットなリストが完成します。

サンプルコード

listA = [[43, [0]], 12, 19, [13, [8, 8]], 21]
print('与えられたネストされたリスト: \n', listA)

# フラットなリストを格納する変数
res = []

# フラット化する関数
def flatlist(l):
    for x in l:
        if type(x) == list:
            flatlist(x)  # 要素がリストなら再帰的に処理
        else:
            res.append(x)  # リストでなければ結果に追加

flatlist(listA)
print('フラット化されたリスト: \n', res)

実行結果

上記のコードを実行すると、以下の出力が得られます。

与えられたネストされたリスト:
[[43, [0]], 12, 19, [13, [8, 8]], 21]
フラット化されたリスト:
[43, 0, 12, 19, 13, 8, 8, 21]

コードの解説

このアプローチのポイントは以下のとおりです。

1. 再帰呼び出し: flatlist 関数は、ループ内で要素がリスト型(type(x) == list)であるかを判定し、リストであれば自分自身を再帰的に呼び出します。これにより、何層のネストがあってもすべての階層を処理できます。

2. 終了条件: 要素がリストではない場合(整数や文字列など)、その値を結果リスト res に追加します。これが再帰の終了条件となります。

3. 汎用性: この方法はネストの深さに依存しないため、[[1, [2, [3, [4]]]]] のような深くネストされたリストでも正しくフラット化できます。

なお、より簡潔に書きたい場合は、ジェネレータを活用した再帰関数や、itertools を組み合わせた方法もありますが、ネストの深さが不定の場合は、上記のような再帰的なアプローチが最も確実で理解しやすい方法です。

  1. Pythonで文字のリストを文字列に変換する方法を解説

    Pythonでは、リスト内の個々の要素をひとつの文字列にまとめたい場面がよくあります。たとえば、データを保存したり送信したりする際に必要となるシリアライズ(直列化)の処理では、このような変換が非常に役立ちます。具体的には、次のような変換を指します。[h, e, l, l, o, , w, o, r, l, d] → hello worldjoinメソッドを使った変換Pythonには、このような変換を実現するためのjoin()メソッドが標準で用意されています。joinメソッドは、区切り文字(デリミタ)として使う文字列に対して呼び出し、引数に渡したリストの各要素を連結します。今回は各文字をつなげ

  2. Pythonでリストをタプルに変換する方法

    Pythonでは、リストをタプルに変換するのは非常に簡単です。組み込み関数である tuple() 関数にリストを引数として渡すだけで、変換することができます。サンプルコードmy_list = [1, 2, 3] my_tuple = tuple(my_list) print(my_tuple)出力結果上記のコードを実行すると、以下のような出力が得られます。(1, 2, 3)解説tuple() 関数は、リストだけでなく文字列や辞書などのイテラブル(反復可能なオブジェクト)もタプルに変換できます。タプルはリストと異なりイミュータブル(変更不可)であるため、データを誤って書き換えたくない場合や、辞書