📘

Pythonのリスト内包表記(List Comprehension)をマスターしよう

2025/03/10に公開

はじめに

Pythonのリスト内包表記は、リストを簡潔に作成するための強力な機能です。通常のforループよりもシンプルで可読性が高く、実行速度も向上します。特に、大量のデータを処理する際に役立ち、短いコードで効率的に処理できます。本記事では、基本から応用までを分かりやすく解説します。

1. リスト内包表記の基本

まずは、基本的な書き方を見てみましょう。

[処理 for 要素 in リスト]

この方法を使うと、forループを使わずに一行でリストを作成できます。

0から9までのリストを作る

[i for i in range(10)]

出力

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2. リスト内包表記でフィルターをかける

リスト内包表記では、特定の条件に合う要素だけを取り出せます。

奇数だけをリストにする

[i for i in range(10) if i % 2]

出力

[1, 3, 5, 7, 9]

3. 条件分岐(if-else)を使う

リスト内包表記では、if-else を使って要素ごとに異なる処理を適用できます。通常のforループでは複数行に分かれてしまう処理も、リスト内包表記を使うことで1行で記述可能です。

偶数と奇数で異なる処理を適用する

[f"奇数:{i}" if i % 2 else f"偶数:{i*1000}" for i in range(10)]

出力

['偶数:0', '奇数:1', '偶数:2000', '奇数:3', '偶数:4000', '奇数:5', '偶数:6000', '奇数:7', '偶数:8000', '奇数:9']

4. enumerate() を使ってインデックス付きリストを作る

enumerate() を使うと、要素に番号を付けたリストを簡単に作成できます。

名前リストに番号を付与する

names = ['Taro', 'Hanako', 'Koji', 'Jiro']
indexed_names = [f"{i+1}:{value}" for i, value in enumerate(names)]

出力

['1:Taro', '2:Hanako', '3:Koji', '4:Jiro']

5. 数値データを整える

リスト内包表記は、データ整理にも役立ちます。例えば、CSVファイルから数値データを読み込み、不要な値を除去したり、単位を変換したりするのに活用できます。

リストの各要素をインデックス付きにする

csv_data = ['1', '0', '5', '100', '-1200']
formatted_data = [f"{i}:{value}" for i, value in enumerate(csv_data)]

出力

['0:1', '1:0', '2:5', '3:100', '4:-1200']

数値を小数点付きにする

formatted_data = [f"{i}:{float(value)/1000:.3f}" for i, value in enumerate(csv_data)]

出力

['0:0.001', '1:0.000', '2:0.005', '3:0.100', '4:-1.200']

6. 条件付きでデータを加工する

リスト内包表記を使えば、特定の条件に応じてデータを変換できます。

最初の3つはそのまま、それ以降は1/1000する

formatted_data = [
    f"{i}:{value}" if i < 3 else f"{i}:{float(value)/1000:.3f}"
    for i, value in enumerate(csv_data)
]

出力

['0:1', '1:0', '2:5', '3:0.100', '4:-1.200']

特定のインデックスを除外する

filtered_data = [
    f"{i}:{value}" if i < 3 else f"{i}:{float(value)/1000:.3f}"
    for i, value in enumerate(csv_data)
    if i != 1  # インデックス1を除外
]

出力

['0:1', '2:5', '3:0.100', '4:-1.200']

7. 多次元リストと辞書内包表記

リスト内包表記は、多次元リストや辞書の生成にも応用できます。

行列を作成する

matrix = [[i * j for j in range(5)] for i in range(5)]

出力

[[0, 0, 0, 0, 0],
 [0, 1, 2, 3, 4],
 [0, 2, 4, 6, 8],
 [0, 3, 6, 9, 12],
 [0, 4, 8, 12, 16]]

辞書を作成する

dictionary = {i: i**2 for i in range(5)}

出力

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

まとめ

リスト内包表記は、リストを作成する際に非常に便利な方法です。

  • 基本構造: [処理 for 要素 in リスト]
  • フィルターをかける: [処理 for 要素 in リスト if 条件]
  • 条件分岐を使う: [処理 if 条件 else 別の処理 for 要素 in リスト]
  • enumerate() を使ってインデックスを追加
  • 多次元リストや辞書の作成にも応用可能

リスト内包表記を活用することで、コードが簡潔で読みやすくなります。ぜひ、実際のプログラムに取り入れてみてください!

Discussion