1. はじめに
Pythonでよく使われるリスト内包表記(list comprehension)は、リストを簡潔に生成できる強力な構文です。
この記事では、「Python|リスト内包表記でコードを簡潔に書く方法」というテーマで、基本から応用までを丁寧に解説します。
通常のfor文よりも短く、読みやすいコードを書けるため、Pythonの可読性をさらに高めることができます。
2. リスト内包表記の基本構文と使い方
リスト内包表記とは?
リスト内包表記とは、既存のリストから新しいリストを作成するための短縮記法です。forループを使って要素を1つずつ処理する代わりに、1行で簡潔に記述できます。
基本構文
# 一般的な構文
[式 for 変数 in イテラブル]
例:0〜4のリストを作る
# 通常のfor文
result = []
for i in range(5):
result.append(i)
print(result) # 実行結果:[0, 1, 2, 3, 4]
# リスト内包表記
result = [i for i in range(5)]
print(result) # 実行結果:[0, 1, 2, 3, 4]
条件付きリスト内包表記
条件分岐(if)も組み込めます。
# 偶数だけを抽出
evens = [i for i in range(10) if i % 2 == 0]
print(evens) # 実行結果:[0, 2, 4, 6, 8]
3. よくある使い方・応用例
文字列のリストから長さを取得
words = ["apple", "banana", "cherry"]
lengths = [len(word) for word in words]
print(lengths) # 実行結果:[5, 6, 6]
ネストしたループ(2重ループ)の内包表記
リスト内包表記はネスト(入れ子)にも対応しています。例えば、行列のすべての値をフラットにすることができます。
matrix = [[1, 2], [3, 4], [5, 6]]
flat = [num for row in matrix for num in row]
print(flat) # 実行結果:[1, 2, 3, 4, 5, 6]
辞書や集合との組み合わせ
リスト内包表記に似た構文で、辞書内包表記や集合内包表記もあります。
# 辞書内包表記
squares = {i: i**2 for i in range(5)}
print(squares) # 実行結果:{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
# 集合内包表記
unique_lengths = {len(word) for word in ["apple", "banana", "fig", "kiwi"]}
print(unique_lengths) # 実行結果:{3, 4, 5, 6}
4. 注意点・エラー対策
複雑すぎる処理は避ける
リスト内包表記は「簡潔に書ける」反面、複雑な処理を詰め込みすぎると可読性が下がるため注意が必要です。読みやすさを重視して、必要に応じて通常のfor文に分解しましょう。
条件分岐でelseを使うときの構文ミス
if-elseを含むリスト内包表記は構文がやや特殊です。以下のように「if else」は式の前に記述します。
# OK
result = ["even" if i % 2 == 0 else "odd" for i in range(5)]
print(result) # 実行結果:['even', 'odd', 'even', 'odd', 'even']
# NG(構文エラー)
# result = [i for i in range(5) if i % 2 == 0 else "odd"]
無理に使わない勇気も必要
すべてをリスト内包表記で書くのではなく、「読みやすさ」や「保守性」も考慮するのがPythonicな書き方です。
5. まとめ
- リスト内包表記を使えば、for文よりも簡潔なコードが書ける
- 条件分岐やネストにも対応し、柔軟性が高い
- ただし、複雑すぎる記述は避けて可読性を重視する
実務では「ログデータの整形」「フィルタ処理」「データの変換」など、データ処理を簡潔にしたい場面で大活躍します。
ぜひ自分のプロジェクトでも取り入れて、Pythonコードをよりスマートにしてみましょう!