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

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.chain.from_iterable() を使う

標準ライブラリ itertoolschain.from_iterable() は、サブリストを効率的に連結できる手法です。メモリ効率が良く高速なので、大規模なデータを扱う場合やパフォーマンスが求められる場面で最適です。

# itertools.chain.from_iterable() を使う方法
from itertools import chain

ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

# 初期リストを表示
print("initial list ", str(ini_list))

# 2次元リストを1次元に変換
flatten_list = list(chain.from_iterable(ini_list))

# フラット化した結果を表示
print("final_result", str(flatten_list))

方法2:リスト内包表記を使う

リスト内包表記を使えば、追加の import なしで簡潔に記述できます。Pythonらしいイディオムとして広く知られており、可読性が高いのが特徴です。

# リスト内包表記を使う方法
ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

# 初期リストを表示
print("initial list ", str(ini_list))

# 2次元リストを1次元に変換
flatten_list = [j for sub in ini_list for j in sub]

# フラット化した結果を表示
print("final_result", str(flatten_list))

方法3:functools.reduce() を使う

functools.reduce() とラムダ式を組み合わせて、サブリストを順番に結合していく方法です。関数型プログラミング的なアプローチですが、各ステップで新しいリストが生成されるため、リストが大きくなるとパフォーマンスが低下する点に注意しましょう。

# functools.reduce() を使う方法
from functools import reduce

ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

# 初期リストを表示
print("initial list ", str(ini_list))

# 2次元リストを1次元に変換
flatten_list = reduce(lambda z, y: z + y, ini_list)

# フラット化した結果を表示
print("final_result", str(flatten_list))

方法4:sum() を使う

sum() の第2引数に空のリスト [] を渡すと、リスト同士の連結として動作します。最も短く書ける一方、内部でリストのコピーが繰り返されるため、あくまでごく小さなリスト向けのテクニックです。

# sum() を使う方法
ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

# 初期リストを表示
print("initial list ", str(ini_list))

# 2次元リストを1次元に変換
flatten_list = sum(ini_list, [])

# フラット化した結果を表示
print("final_result", str(flatten_list))

方法5:再帰的なラムダ式を使う(任意の深さのネストに対応)

これまでの方法はいずれも2次元リスト専用ですが、再帰処理を利用すれば3次元以上の深くネストしたリストにも対応できます。以下の例では、ラムダ式が自分自身を再帰的に呼び出し、リストである限り完全に展開します。

# 再帰的なラムダ式を使う方法
ini_list = [[1, 2, 3],
            [3, 6, 7],
            [7, 5, 4]]

# リストなら再帰的に展開し、それ以外はそのまま返す
flatten_list = lambda y: [x for a in y for x in flatten_list(a)] if type(y) is list else [y]

# 初期リストを表示
print("Initial list ", ini_list)

# フラット化した結果を表示
print("Flattened List ", flatten_list(ini_list))

実行結果

いずれの方法でも、同じ入力リストに対して最終的に次のような1次元リストが得られます。

('initial list ', '[[1, 2, 3], [3, 6, 7], [7, 5, 4]]')
('final_result', '[1, 2, 3, 3, 6, 7, 7, 5, 4]')
...
('Initial list ', [[1, 2, 3], [3, 6, 7], [7, 5, 4]])
('Flattened List ', [1, 2, 3, 3, 6, 7, 7, 5, 4])

まとめ:どの方法を選ぶべきか?

方法特徴おすすめの場面
chain.from_iterable()高速かつメモリ効率が良い大規模データ・パフォーマンス重視
リスト内包表記import 不要で可読性が高い小〜中規模のリスト・日常的な用途
functools.reduce()関数型的な書き方学習目的・既存コードとの整合性
sum()最も短く書けるごく小さなリストのみ
再帰ラムダ式任意の深さのネストに対応多重ネスト構造の展開

通常の用途であれば、速度面で優れる chain.from_iterable() か、シンプルで読みやすいリスト内包表記を選ぶのがベストプラクティスです。ネストの深さが不定のデータを扱う場合は、再帰的なアプローチを検討しましょう。

  1. Pythonでリストを空にする(クリアする)4つの方法を徹底解説

    Pythonでは、リスト内のすべての要素を削除してリストを空にする方法が複数あります。本記事では、代表的な4つの手法——clear()メソッド、del文、*= 0による代入、そしてリストの再初期化——について、それぞれのコード例と実行結果とともにわかりやすく解説します。 1. clear()メソッドを使う方法 clear()はPythonの標準ライブラリに組み込まれたリスト用メソッドで、呼び出すだけでリストの中身を完全に空にできます。最もシンプルで直感的な方法です。 構文: list_name.clear() # list_name には対象となるリスト名を指定します コード例 以下の例では、

  2. Pythonでネストしたリスト(浅いリスト)をフラット化する方法

    Pythonでは、リストの中にリストが入った「入れ子(ネスト)構造」のデータを、1次元のフラットなリストに変換したい場面がよくあります。この記事では、浅い階層のリストをフラット化する代表的な方法を、具体的なコード例とともに紹介します。 方法1:ネストしたforループを使う 最もシンプルで直感的なのは、2重のforループを使ってサブリストから要素を1つずつ取り出し、空のリストへ順番に追加していく方法です。処理の流れが分かりやすいため、Python初心者にもおすすめのアプローチです。 lst = [[10, 20, 30, 40], [50, 60, 70, 80], [90, 100, 110