Pythonには、既存のリスト(または他のイテラブル)を元に、新しいリストを簡潔に作成するための**「リスト内包表記(List Comprehensions)」**という機能があります。
これはPythonの大きな特徴の一つであり、通常の for 文を使って append() を繰り返す記述に比べて、コードが短くなり、処理速度も向上する傾向があります。
この記事では、リスト内包表記の基本的な書き方と、条件(if)を加えたフィルタリングの方法について解説します。
目次
1. リスト内包表記の基本構文
リスト内包表記は、[](角括弧)の中に for 文を埋め込むような形式で記述します。
構文:
[適用する式 for 変数 in イテラブル]
具体的な使用例
例として、商品の「税抜価格リスト」から、消費税(10%)を加えた「税込価格リスト」を新規作成する場合を考えます。
# 税抜価格のリスト
base_prices = [100, 250, 500, 980]
# リスト内包表記を使用
# 各要素 (price) を 1.1 倍にして新しいリストを作成
tax_included = [int(price * 1.1) for price in base_prices]
print(f"税抜: {base_prices}")
print(f"税込: {tax_included}")
実行結果:
税抜: [100, 250, 500, 980]
税込: [110, 275, 550, 1078]
2. 通常の for 文との比較
同じ処理を、リスト内包表記を使わずに通常の for 文と .append() メソッドで記述すると以下のようになります。
base_prices = [100, 250, 500, 980]
tax_included_loop = []
# 通常のfor文を使用
for price in base_prices:
tax_included_loop.append(int(price * 1.1))
print(f"for文での結果: {tax_included_loop}")
実行結果:
for文での結果: [110, 275, 550, 1078]
結果は同じですが、リスト内包表記の方が:
- 事前に空のリスト(
tax_included_loop = [])を用意する必要がない。 appendを書く必要がない。- 処理が1行で完結する。
という点で優れています。
3. 条件付きリスト内包表記(if文によるフィルタリング)
リスト内包表記の末尾に if 文を追加することで、特定の条件を満たす要素だけを取り出して処理することができます。
構文:
[適用する式 for 変数 in イテラブル if 条件式]
具体的な使用例
テストの点数リストから、合格点(70点以上)のものだけを抽出する例です。
# テストの点数リスト
all_scores = [65, 90, 45, 80, 72, 55]
# 70点以上のスコアのみを抽出
passing_scores = [score for score in all_scores if score >= 70]
print(f"全スコア: {all_scores}")
print(f"合格スコア: {passing_scores}")
実行結果:
全スコア: [65, 90, 45, 80, 72, 55]
合格スコア: [90, 80, 72]
このコードは、以下の通常の for 文と同じ動作をします。
passing_scores_loop = []
for score in all_scores:
if score >= 70:
passing_scores_loop.append(score)
内包表記を使うことで、4行のコードを1行に短縮できました。
まとめ
- リスト内包表記は、新しいリストを作成するための簡潔な構文です。
[式 for 変数 in リスト]の形式で記述します。- 末尾に
ifを付けることで、特定の要素だけをフィルタリング(抽出)できます。 - 単純なリスト作成や変換処理においては、通常の
forループよりも可読性が高く、Python的な書き方(Pythonic)とされています。
