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

Pythonでネストしたリスト内包表記をマスター!行列作成からフラット化まで

ネストされたリスト(入れ子リスト)とは、リストの中にさらにリストが含まれている構造のことです。Pythonにはこうしたネスト構造をスマートに扱うための仕組みが備わっており、リスト内包表記を使えば、簡潔で読みやすいコードでさまざまな操作を行えます。

本記事では、リスト内包表記を活用してネストされたリストを作成・操作する方法を、具体例とともに解説します。

行列(マトリックス)の作成

行列を作成するには、行と列の組み合わせを定義する必要があります。forループを含むリスト内包表記を、別のforループ付きリスト内包表記の中に入れ子にすることで、3行×4列の行列を簡単に生成できます。

matrix = [[m for m in range(4)] for n in range(3)]
print(matrix)

上記のコードを実行すると、次の結果が得られます。

[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

ネストされたリストからの要素抽出(フィルタリング)

内側のリストを走査するforループにif条件を組み合わせると、条件に合致する要素だけを抽出できます。以下の例では、12か月分の月名を格納した2次元リストから、文字数が5文字以下の月名のみを取り出しています。

months = [['January', 'February', 'March'], ['April', 'May', 'June'], ['July', 'August', 'September'], ['October', 'November', 'December']]
# if条件付きのネストされたリスト内包表記
short_months = [month for sublist in months for month in sublist if len(month) <= 5]
print(short_months)

上記のコードを実行すると、次の結果が得られます。

['March', 'April', 'May', 'June', 'July']

ポイントは、内包表記内のfor文を「外側のリスト→内側のリスト」の順に記述し、最後に条件式を追加する点です。変数名を用途に応じて分ければ、同じ名前を再利用して混乱を招くことなく、意図が明確で保守性の高いコードになります。

ネストされたサブリストのフラット化(平坦化)

複数のサブリストを持つネストされたリストを、サブリストを含まない1つのリストへ変換(フラット化)することも可能です。

nested_list = [[1], [17, 19], [21, 23, 25], [32, 35, 37, 39]]
# 2次元リストをフラット化するネストされたリスト内包表記
flattened_list = [value for sublist in nested_list for value in sublist]
print(flattened_list)

上記のコードを実行すると、次の結果が得られます。

[1, 17, 19, 21, 23, 25, 32, 35, 37, 39]

まとめ

リスト内包表記を入れ子にすることで、行列の生成、条件によるフィルタリング、多次元リストの平坦化といった処理を、わずか数行のコードで美しく実現できます。ネストしたforループで書くよりもはるかに簡潔になるため、日常的なPythonプログラミングにぜひ取り入れてみてください。


  1. Python入門:リストスライスとリスト内包表記の基本を徹底解説

    この記事では、Pythonにおけるリストスライス(list slicing)とリスト内包表記(list comprehension)について、初心者にもわかりやすく解説します。リストスライスとは?「スライス」という言葉は、文字通り「何かを小さく切り分ける」という意味です。リストスライスとは、元のリストから一部分だけを取り出す処理のことを指します。どこから切り出すか(開始位置)、どこで止めるか(終了位置)、どの間隔で切り出すか(ステップ数)を自由に指定できるのが特徴です。リスト内包表記とは?リスト内包表記は、既存のリストをもとに新しいリストを生成するための記法です。forループや条件式を1行にま

  2. Pythonのリスト内包表記とは?基本構文から実践例までわかりやすく解説

    Pythonには、あるリストから別のリストを生成するための簡潔な構文が用意されています。これらの式は「リスト内包表記(List Comprehensions)」と呼ばれ、Pythonにおける最も強力な機能の一つです。リスト内包表記は、Pythonが関数型プログラミングの概念をサポートしている好例でもあります。リスト内包表記を使うと、関数やフィルタ処理をリストの各要素に簡単に適用できます。正しく使えば非常に便利ですが、使い方を誤るとかえって読みにくいコードになってしまうため注意が必要です。基本構文リスト内包表記の一般的な構文は以下の通りです。[expr for element in iterab