📘
Pythonのリスト内包表記(List Comprehension)をマスターしよう
はじめに
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']
enumerate()
を使ってインデックス付きリストを作る
4. 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