✨ ステップ15: 内包表記
リストや辞書を1行で作る、Pythonの魔法のような書き方!
今までリストを作る時は、空のリストを作って、for文で要素を追加していました。Pythonには、これを1行で書ける内包表記という便利な書き方があります。
📖 このステップで学ぶこと
・リスト内包表記の基本
・条件付き内包表記(ifでフィルタリング)
・if-else付き内包表記(値の変換)
・辞書内包表記
・入れ子の内包表記
・可読性とのバランス
🎯 1. 内包表記って何?
まず、内包表記がどんなものかを理解しましょう。
🔰 従来の方法(for文を使う)
例えば、1から5までの数字を2倍にしたリストを作りたいとします。
今まで学んだ方法では、以下のように書きました。
コード:従来の方法(for文)
※スマートフォンでは横スクロールできます
# 空のリストを作成
numbers = []
# 1から5まで繰り返す
for i in range(1, 6):
# iを2倍にしてリストに追加
numbers.append(i * 2)
print(numbers)
実行結果
[2, 4, 6, 8, 10]
この方法は分かりやすいですが、4行かかります。
🔰 内包表記を使う方法
同じことを内包表記で書くと、たった1行になります!
コード:内包表記を使う方法
※スマートフォンでは横スクロールできます
# [式 for 変数 in イテラブル] という形式
# i * 2 → 各要素に対して行う処理(iを2倍する)
# for i in range(1, 6) → 1から5まで繰り返す
numbers = [i * 2 for i in range(1, 6)]
print(numbers)
実行結果
[2, 4, 6, 8, 10]
結果は同じですが、1行で書けました!
💡 内包表記のイメージ
内包表記は「リストの中にfor文を書く」というイメージです。
[ ] の中に「何をするか」と「どう繰り返すか」を書きます。
・[i * 2 → 「iを2倍にしたものを」
・for i in range(1, 6)] → 「1から5まで繰り返して作る」
📝 2. リスト内包表記の基本
📘 リスト内包表記の書き方
📝 リスト内包表記の基本構文
[式 for 変数 in イテラブル]
・式:各要素に対して行う処理(計算や変換)
・変数:繰り返しで使う変数
・イテラブル:繰り返す対象(range、リスト、文字列など)
📌 従来の方法との対応
| 内包表記 | 従来の方法 |
[式 for 変数 in イテラブル] |
result = []for 変数 in イテラブル: result.append(式)
|
📝 例1: 数字のリストを作る
1から10までの数字のリストを作ってみましょう。
完成コード:1から10までの数字
※スマートフォンでは横スクロールできます
# [i for i in range(1, 11)] の意味
# i → そのまま(変換せずにそのまま使う)
# for i in range(1, 11) → 1から10まで繰り返す
numbers = [i for i in range(1, 11)]
print(numbers)
実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
💡 ポイント
この例では式がiだけなので、単純にrange(1, 11)の値をリストにしています。
実はlist(range(1, 11))と書いても同じ結果になります。
📝 例2: 2乗のリストを作る
1から5までの数字の2乗(1, 4, 9, 16, 25)のリストを作ってみましょう。
完成コード:2乗のリスト
※スマートフォンでは横スクロールできます
# [i ** 2 for i in range(1, 6)] の意味
# i ** 2 → iを2乗する(1→1, 2→4, 3→9, ...)
# for i in range(1, 6) → 1から5まで繰り返す
squares = [i ** 2 for i in range(1, 6)]
print(squares)
実行結果
[1, 4, 9, 16, 25]
📝 例3: 文字列を大文字に変換
内包表記はリストの要素に対しても使えます。
完成コード:文字列を大文字に
※スマートフォンでは横スクロールできます
# 元のリスト
words = ["hello", "world", "python"]
# [word.upper() for word in words] の意味
# word.upper() → 各単語を大文字に変換
# for word in words → wordsの各要素を繰り返す
upper_words = [word.upper() for word in words]
print(upper_words)
実行結果
['HELLO', 'WORLD', 'PYTHON']
📝 例4: 文字列から1文字ずつ取り出す
文字列も繰り返しの対象にできます。
完成コード:文字列を1文字ずつリストに
※スマートフォンでは横スクロールできます
# 文字列
text = "Python"
# [char for char in text] の意味
# char → 各文字をそのまま使う
# for char in text → 文字列の各文字を繰り返す
chars = [char for char in text]
print(chars)
実行結果
['P', 'y', 't', 'h', 'o', 'n']
📝 例5: 計算を含む内包表記
税込み価格を計算するリストを作ってみましょう。
完成コード:税込み価格のリスト
※スマートフォンでは横スクロールできます
# 税抜き価格のリスト
prices = [100, 200, 300, 500, 1000]
# [int(price * 1.1) for price in prices] の意味
# int(price * 1.1) → 価格を1.1倍して整数に変換(税込み価格)
# for price in prices → pricesの各価格を繰り返す
tax_included = [int(price * 1.1) for price in prices]
print(f"税抜き: {prices}")
print(f"税込み: {tax_included}")
実行結果
税抜き: [100, 200, 300, 500, 1000] 税込み: [110, 220, 330, 550, 1100]
📌 リスト内包表記のメリット
・コードが短くなる(4行が1行に)
・慣れると読みやすい
・実行速度が少し速い(ただし体感できるほどではない)
・Pythonicな書き方として推奨されている
🔍 3. 条件付き内包表記(ifでフィルタリング)
内包表記にifを加えると、条件に合う要素だけを選んでリストを作れます。
🔰 条件付き内包表記とは?
例えば、「1から10の中で偶数だけ」のリストを作りたい場合を考えてみましょう。
従来の方法では、for文の中にif文を書きます。
コード:従来の方法(for文 + if文)
※スマートフォンでは横スクロールできます
# 空のリストを作成
even_numbers = []
# 1から10まで繰り返す
for i in range(1, 11):
# 偶数かどうかチェック
if i % 2 == 0:
even_numbers.append(i)
print(even_numbers)
実行結果
[2, 4, 6, 8, 10]
これを内包表記で書くと、1行になります。
📘 条件付き内包表記の書き方
📝 条件付き内包表記の構文
[式 for 変数 in イテラブル if 条件]
・if 条件が最後に付きます
・条件がTrueの要素だけがリストに入ります
・これを「フィルタリング」と呼びます
完成コード:偶数だけのリスト
※スマートフォンでは横スクロールできます
# [i for i in range(1, 11) if i % 2 == 0] の意味
# i → そのまま使う
# for i in range(1, 11) → 1から10まで繰り返す
# if i % 2 == 0 → 2で割った余りが0(偶数)の場合だけ
even_numbers = [i for i in range(1, 11) if i % 2 == 0]
print(even_numbers)
実行結果
[2, 4, 6, 8, 10]
💡 処理の流れ
1. i = 1 → 1 % 2 = 1 ≠ 0 → 条件False → 追加しない
2. i = 2 → 2 % 2 = 0 → 条件True → 2を追加
3. i = 3 → 3 % 2 = 1 ≠ 0 → 条件False → 追加しない
4. i = 4 → 4 % 2 = 0 → 条件True → 4を追加
…以下同様…
📝 例1: 正の数だけ取り出す
正と負が混ざったリストから、正の数だけを取り出してみましょう。
完成コード:正の数だけ
※スマートフォンでは横スクロールできます
# 正負が混ざったリスト
numbers = [5, -3, 8, -1, 10, -7, 2]
# [n for n in numbers if n > 0] の意味
# n → そのまま使う
# for n in numbers → numbersの各要素を繰り返す
# if n > 0 → 0より大きい(正の数)の場合だけ
positive = [n for n in numbers if n > 0]
print(f"元のリスト: {numbers}")
print(f"正の数だけ: {positive}")
実行結果
元のリスト: [5, -3, 8, -1, 10, -7, 2] 正の数だけ: [5, 8, 10, 2]
📝 例2: 長い単語だけ取り出す
文字数が一定以上の単語だけを取り出してみましょう。
完成コード:4文字以上の単語
※スマートフォンでは横スクロールできます
# 単語のリスト
words = ["cat", "dog", "elephant", "fox", "giraffe", "ant"]
# [word for word in words if len(word) >= 4] の意味
# word → そのまま使う
# for word in words → wordsの各要素を繰り返す
# if len(word) >= 4 → 文字数が4以上の場合だけ
long_words = [word for word in words if len(word) >= 4]
print(f"元のリスト: {words}")
print(f"4文字以上: {long_words}")
実行結果
元のリスト: ['cat', 'dog', 'elephant', 'fox', 'giraffe', 'ant'] 4文字以上: ['elephant', 'giraffe']
📝 例3: 合格点以上の点数だけ
60点以上の点数だけを取り出してみましょう。
完成コード:60点以上の点数
※スマートフォンでは横スクロールできます
# 点数のリスト
scores = [45, 78, 92, 55, 88, 34, 100, 62]
# 60点以上の点数だけ
passed = [score for score in scores if score >= 60]
print(f"全ての点数: {scores}")
print(f"合格点以上: {passed}")
print(f"合格者数: {len(passed)}人")
実行結果
全ての点数: [45, 78, 92, 55, 88, 34, 100, 62] 合格点以上: [78, 92, 88, 100, 62] 合格者数: 5人
📝 例4: 特定の文字を含む単語だけ
「a」を含む単語だけを取り出してみましょう。
完成コード:「a」を含む単語
※スマートフォンでは横スクロールできます
# 単語のリスト
words = ["apple", "banana", "cherry", "date", "elderberry"]
# "a" in word → wordに"a"が含まれているか
words_with_a = [word for word in words if "a" in word]
print(f"元のリスト: {words}")
print(f"「a」を含む: {words_with_a}")
実行結果
元のリスト: ['apple', 'banana', 'cherry', 'date', 'elderberry'] 「a」を含む: ['apple', 'banana', 'date']
📝 例5: フィルタリングと変換を同時に
条件でフィルタリングしながら、値を変換することもできます。
完成コード:正の数だけを2倍にする
※スマートフォンでは横スクロールできます
# 正負が混ざったリスト
numbers = [5, -3, 8, -1, 10, -7]
# [n * 2 for n in numbers if n > 0] の意味
# n * 2 → 2倍にする(変換)
# for n in numbers → numbersの各要素を繰り返す
# if n > 0 → 正の数だけ(フィルタリング)
doubled_positive = [n * 2 for n in numbers if n > 0]
print(f"元のリスト: {numbers}")
print(f"正の数を2倍: {doubled_positive}")
実行結果
元のリスト: [5, -3, 8, -1, 10, -7] 正の数を2倍: [10, 16, 20]
📌 条件付き内包表記のまとめ
・[式 for 変数 in イテラブル if 条件]
・ifは最後に書く
・条件がTrueの要素だけがリストに入る
・これを「フィルタリング」と呼ぶ
・式の部分で変換も同時にできる
🔄 4. if-else付き内包表記(値の変換)
条件によって異なる値を生成したい時は、式の部分にif-elseを書きます。
🔰 フィルタリングとの違い
先ほどの条件付き内包表記は「条件に合うものだけを選ぶ」でした。
今回学ぶif-else付き内包表記は「全ての要素を、条件によって異なる値に変換する」です。
📌 2種類の条件付き内包表記
| 種類 | 構文 | 用途 |
| フィルタリング | [式 for x in list if 条件] |
条件に合う要素だけ選ぶ |
| 値の変換 | [式1 if 条件 else 式2 for x in list] |
条件で異なる値に変換 |
注意:ifの位置が違います!
📘 if-else付き内包表記の書き方
📝 if-else付き内包表記の構文
[式1 if 条件 else 式2 for 変数 in イテラブル]
・式1:条件がTrueの時の値
・式2:条件がFalseの時の値
・if-elseは式の前に書きます
📝 例1: 偶数・奇数の判定
数字が偶数なら「偶数」、奇数なら「奇数」というラベルに変換してみましょう。
完成コード:偶数・奇数のラベル
※スマートフォンでは横スクロールできます
# 数字のリスト
numbers = [1, 2, 3, 4, 5]
# ["偶数" if n % 2 == 0 else "奇数" for n in numbers] の意味
# "偶数" if n % 2 == 0 else "奇数" → 偶数なら"偶数"、そうでなければ"奇数"
# for n in numbers → numbersの各要素を繰り返す
labels = ["偶数" if n % 2 == 0 else "奇数" for n in numbers]
print(f"数字: {numbers}")
print(f"ラベル: {labels}")
実行結果
数字: [1, 2, 3, 4, 5] ラベル: ['奇数', '偶数', '奇数', '偶数', '奇数']
📝 例2: 合否判定
点数が60点以上なら「合格」、未満なら「不合格」に変換してみましょう。
完成コード:合否判定
※スマートフォンでは横スクロールできます
# 点数のリスト
scores = [75, 45, 88, 55, 92]
# "合格" if s >= 60 else "不合格" → 60点以上なら合格、そうでなければ不合格
results = ["合格" if s >= 60 else "不合格" for s in scores]
# 点数と結果を並べて表示
for score, result in zip(scores, results):
print(f"{score}点 → {result}")
実行結果
75点 → 合格 45点 → 不合格 88点 → 合格 55点 → 不合格 92点 → 合格
📝 例3: 負の数を0にする
負の数は0に、正の数はそのままにしてみましょう。
完成コード:負の数を0に
※スマートフォンでは横スクロールできます
# 正負が混ざったリスト
numbers = [5, -3, 8, -1, 10, -7]
# n if n > 0 else 0 → 正ならそのまま、そうでなければ0
processed = [n if n > 0 else 0 for n in numbers]
print(f"元のリスト: {numbers}")
print(f"処理後: {processed}")
実行結果
元のリスト: [5, -3, 8, -1, 10, -7] 処理後: [5, 0, 8, 0, 10, 0]
📝 例4: 絶対値に変換
負の数はプラスに、正の数はそのままにして、絶対値のリストを作ってみましょう。
完成コード:絶対値のリスト
※スマートフォンでは横スクロールできます
# 正負が混ざったリスト
numbers = [5, -3, 8, -1, 10, -7]
# n if n >= 0 else -n → 正ならそのまま、負なら符号を反転
absolute = [n if n >= 0 else -n for n in numbers]
print(f"元のリスト: {numbers}")
print(f"絶対値: {absolute}")
実行結果
元のリスト: [5, -3, 8, -1, 10, -7] 絶対値: [5, 3, 8, 1, 10, 7]
💡 abs()関数でも同じことができる
Pythonには絶対値を求めるabs()関数があります。
[abs(n) for n in numbers]と書いても同じ結果になります。
🔑 重要!ifの位置に注意
フィルタリング(要素を選ぶ):
[x for x in list if 条件] → ifは最後
値の変換:
[式1 if 条件 else 式2 for x in list] → if-elseは式の前
この2つは位置が違うので、混同しないようにしましょう!
📚 5. 辞書内包表記
リストだけでなく、辞書も内包表記で作れます!
🔰 辞書内包表記とは?
辞書を作る時も、従来はfor文を使っていました。
例えば、1から5までの数字をキーに、その2乗を値にした辞書を作るには:
コード:従来の方法(for文)
※スマートフォンでは横スクロールできます
# 空の辞書を作成
squares_dict = {}
# 1から5まで繰り返す
for i in range(1, 6):
squares_dict[i] = i ** 2 # キー:値 を追加
print(squares_dict)
実行結果
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
これを辞書内包表記で書くと、1行になります。
📘 辞書内包表記の書き方
📝 辞書内包表記の構文
{キー: 値 for 変数 in イテラブル}
・リスト内包表記の[ ]を{ }に変える
・式の部分をキー: 値の形式にする
完成コード:数字と2乗の辞書
※スマートフォンでは横スクロールできます
# {i: i**2 for i in range(1, 6)} の意味
# i: i**2 → キーがi、値がiの2乗
# for i in range(1, 6) → 1から5まで繰り返す
squares_dict = {i: i**2 for i in range(1, 6)}
print(squares_dict)
実行結果
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
📝 例1: 2つのリストから辞書を作る
名前のリストと年齢のリストから、名前をキー、年齢を値とする辞書を作ってみましょう。
完成コード:名前と年齢の辞書
※スマートフォンでは横スクロールできます
# 2つのリスト
names = ["太郎", "花子", "次郎"]
ages = [15, 14, 16]
# zip(names, ages) → 2つのリストを組み合わせる
# ("太郎", 15), ("花子", 14), ("次郎", 16) のように
# name: age → 名前をキー、年齢を値にする
name_age_dict = {name: age for name, age in zip(names, ages)}
print(name_age_dict)
実行結果
{'太郎': 15, '花子': 14, '次郎': 16}
💡 zip()関数について
zip(リスト1, リスト2)は、2つのリストの要素をペアにして繰り返せます。
・names[0]とages[0] → (“太郎”, 15)
・names[1]とages[1] → (“花子”, 14)
・names[2]とages[2] → (“次郎”, 16)
📝 例2: 条件付き辞書内包表記
辞書内包表記にも条件を付けられます。60点以上の人だけの辞書を作ってみましょう。
完成コード:60点以上の人だけ
※スマートフォンでは横スクロールできます
# 元の辞書(名前:点数)
scores = {"太郎": 75, "花子": 55, "次郎": 88, "美咲": 45}
# scores.items() → 辞書のキーと値をペアで取り出す
# if score >= 60 → 60点以上の場合だけ
passed = {name: score for name, score in scores.items() if score >= 60}
print(f"全員: {scores}")
print(f"合格者: {passed}")
実行結果
全員: {'太郎': 75, '花子': 55, '次郎': 88, '美咲': 45}
合格者: {'太郎': 75, '次郎': 88}
📝 例3: 値を変換する
全ての価格を2倍にしてみましょう。
完成コード:価格を2倍に
※スマートフォンでは横スクロールできます
# 元の価格辞書
prices = {"りんご": 100, "バナナ": 150, "オレンジ": 120}
# item: price * 2 → キーはそのまま、値を2倍にする
double_prices = {item: price * 2 for item, price in prices.items()}
print(f"元の価格: {prices}")
print(f"2倍の価格: {double_prices}")
実行結果
元の価格: {'りんご': 100, 'バナナ': 150, 'オレンジ': 120}
2倍の価格: {'りんご': 200, 'バナナ': 300, 'オレンジ': 240}
📝 例4: 文字数をカウントする辞書
各単語をキーに、その文字数を値とする辞書を作ってみましょう。
完成コード:単語と文字数の辞書
※スマートフォンでは横スクロールできます
# 単語のリスト
words = ["Python", "is", "awesome", "programming"]
# word: len(word) → 単語をキー、文字数を値にする
lengths = {word: len(word) for word in words}
print(lengths)
実行結果
{'Python': 6, 'is': 2, 'awesome': 7, 'programming': 11}
📝 例5: キーと値を入れ替える
辞書のキーと値を入れ替えてみましょう。
完成コード:キーと値を入れ替え
※スマートフォンでは横スクロールできます
# 元の辞書(名前:年齢)
original = {"太郎": 15, "花子": 14, "次郎": 16}
# v: k → 値をキーに、キーを値にする
swapped = {v: k for k, v in original.items()}
print(f"元の辞書: {original}")
print(f"入れ替え: {swapped}")
実行結果
元の辞書: {'太郎': 15, '花子': 14, '次郎': 16}
入れ替え: {15: '太郎', 14: '花子', 16: '次郎'}
🔄 6. 入れ子の内包表記
内包表記は入れ子にすることもできますが、読みにくくなりやすいので注意が必要です。
📝 例1: 2次元リストの作成
3×3の行列(2次元リスト)を作ってみましょう。
完成コード:3×3の行列
※スマートフォンでは横スクロールできます
# [[i * j for j in range(1, 4)] for i in range(1, 4)] の意味
# 外側のループ: for i in range(1, 4) → i = 1, 2, 3
# 内側のリスト内包表記: [i * j for j in range(1, 4)] → j = 1, 2, 3 で i*j を計算
matrix = [[i * j for j in range(1, 4)] for i in range(1, 4)]
# 見やすく表示
for row in matrix:
print(row)
実行結果
[1, 2, 3] [2, 4, 6] [3, 6, 9]
💡 処理の流れ
i = 1の時:[1*1, 1*2, 1*3] = [1, 2, 3]
i = 2の時:[2*1, 2*2, 2*3] = [2, 4, 6]
i = 3の時:[3*1, 3*2, 3*3] = [3, 6, 9]
📝 例2: リストの平坦化
2次元リストを1次元にする(平坦化する)こともできます。
完成コード:リストの平坦化
※スマートフォンでは横スクロールできます
# 2次元リスト(リストの中にリスト)
nested = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# [num for row in nested for num in row] の意味
# for row in nested → まず外側のリストを繰り返す
# for num in row → 次に各行の要素を繰り返す
flat = [num for row in nested for num in row]
print(f"元のリスト: {nested}")
print(f"平坦化: {flat}")
実行結果
元のリスト: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 平坦化: [1, 2, 3, 4, 5, 6, 7, 8, 9]
💡 forの順番に注意
入れ子のforは、外側のforを先に書きます。
・for row in nested → 外側(リスト全体)
・for num in row → 内側(各行の要素)
これは通常のfor文を入れ子にした時と同じ順番です。
⚠️ 複雑すぎる内包表記は避けよう
内包表記が複雑になりすぎたら、通常のfor文を使った方が読みやすいです。
目安として:
・1行で読めない内包表記は複雑すぎる
・入れ子が2段階以上は避けた方がいい
・条件がたくさんある場合もfor文の方が良い
コードは「短さ」より「読みやすさ」が大切です!
🔧 7. セット内包表記
リストと同様に、セット(集合)も内包表記で作れます。
📝 セット内包表記の構文
{式 for 変数 in イテラブル}
リスト内包表記の[ ]を{ }に変えるだけ!
(辞書内包表記と違い、キー: 値の形式ではない)
完成コード:文字のセット
※スマートフォンでは横スクロールできます
# 文字列から母音だけのセットを作る
text = "Hello World"
# char.lower() → 小文字に変換
# if char.lower() in "aeiou" → 母音かどうかチェック
# セットなので重複は自動的に除去される
vowels = {char.lower() for char in text if char.lower() in "aeiou"}
print(f"文字列: {text}")
print(f"母音のセット: {vowels}")
実行結果
文字列: Hello World
母音のセット: {'e', 'o'}
📌 内包表記の種類まとめ
| 種類 | 構文 | 結果 |
| リスト内包表記 | [式 for x in list] |
リスト |
| 辞書内包表記 | {key: value for x in list} |
辞書 |
| セット内包表記 | {式 for x in list} |
セット |
🎯 8. 実践的な例
ここまで学んだ内包表記を使って、実用的なプログラムを作ってみましょう。
例1: 温度変換リスト
摂氏温度を華氏温度に変換するリストを作ってみましょう。
📌 摂氏から華氏への変換式
華氏 = 摂氏 × 1.8 + 32
完成コード:温度変換
※スマートフォンでは横スクロールできます
# 摂氏温度のリスト
celsius = [0, 10, 20, 30, 40]
# c * 1.8 + 32 → 摂氏を華氏に変換
fahrenheit = [c * 1.8 + 32 for c in celsius]
# 結果を表示
print("摂氏 → 華氏")
for c, f in zip(celsius, fahrenheit):
print(f"{c}℃ → {f}℉")
実行結果
摂氏 → 華氏 0℃ → 32.0℉ 10℃ → 50.0℉ 20℃ → 68.0℉ 30℃ → 86.0℉ 40℃ → 104.0℉
例2: 税込み価格の計算
商品名と価格の辞書から、税込み価格の辞書を作ってみましょう。
完成コード:税込み価格の辞書
※スマートフォンでは横スクロールできます
# 税抜き価格の辞書
prices = {"コーヒー": 300, "ケーキ": 450, "サンドイッチ": 380}
# int(price * 1.1) → 税込み価格(10%)を整数に
tax_included = {item: int(price * 1.1) for item, price in prices.items()}
print("【税込み価格】")
for item, price in tax_included.items():
print(f"{item}: {price}円")
実行結果
【税込み価格】 コーヒー: 330円 ケーキ: 495円 サンドイッチ: 418円
例3: 成績のグレード変換
点数を成績グレード(A, B, C, D, F)に変換してみましょう。
完成コード:成績のグレード変換
※スマートフォンでは横スクロールできます
# 点数と名前の辞書
scores = {"太郎": 92, "花子": 78, "次郎": 65, "美咲": 45, "健太": 88}
# グレードを決める関数(内包表記の中で使う)
def get_grade(score):
if score >= 90:
return "A"
elif score >= 80:
return "B"
elif score >= 70:
return "C"
elif score >= 60:
return "D"
else:
return "F"
# 辞書内包表記で変換
grades = {name: get_grade(score) for name, score in scores.items()}
print("【成績グレード】")
for name, grade in grades.items():
print(f"{name}: {grade}")
実行結果
【成績グレード】 太郎: A 花子: C 次郎: D 美咲: F 健太: B
💡 関数と内包表記の組み合わせ
複雑な処理は関数にしておくと、内包表記がシンプルになります。
get_grade(score)という関数を呼び出すだけで、複雑な条件分岐ができます。
例4: ファイル名の一括変換
ファイル名のリストから、拡張子を変換したリストを作ってみましょう。
完成コード:拡張子の変換
※スマートフォンでは横スクロールできます
# 元のファイル名リスト(.txtファイル)
txt_files = ["document1.txt", "report.txt", "data.txt", "notes.txt"]
# .txt を .md に変換
# file.replace(".txt", ".md") → .txtを.mdに置換
md_files = [file.replace(".txt", ".md") for file in txt_files]
print("【変換結果】")
for old, new in zip(txt_files, md_files):
print(f"{old} → {new}")
実行結果
【変換結果】 document1.txt → document1.md report.txt → report.md data.txt → data.md notes.txt → notes.md
例5: データのクレンジング
文字列のリストから、空白を除去し、空の文字列を除外してみましょう。
完成コード:データのクレンジング
※スマートフォンでは横スクロールできます
# 不揃いなデータ(空白や空の文字列がある)
raw_data = [" apple ", "banana", " ", "", "cherry ", " date"]
# s.strip() → 前後の空白を除去
# if s.strip() → 空白除去後に空でないものだけ
cleaned = [s.strip() for s in raw_data if s.strip()]
print(f"元のデータ: {raw_data}")
print(f"クレンジング後: {cleaned}")
実行結果
元のデータ: [' apple ', 'banana', ' ', '', 'cherry ', ' date'] クレンジング後: ['apple', 'banana', 'cherry', 'date']
例6: 成績の統計
名前と点数の辞書から、平均点以上の人の辞書と、点数順の名前リストを作ってみましょう。
完成コード:成績の統計
※スマートフォンでは横スクロールできます
# 点数の辞書
scores = {"太郎": 75, "花子": 55, "次郎": 88, "美咲": 92}
# 平均点を計算
# sum(scores.values()) → 全ての点数の合計
# len(scores) → 人数
average = sum(scores.values()) / len(scores)
print(f"平均点: {average}点")
# 1. 平均点以上の人の辞書
above_average = {name: score for name, score in scores.items()
if score >= average}
print(f"平均点以上: {above_average}")
# 2. 点数順(高い順)の名前リスト
# sorted(scores.items(), key=lambda x: x[1], reverse=True)
# → 点数(x[1])で降順ソート
sorted_names = [name for name, score in
sorted(scores.items(), key=lambda x: x[1], reverse=True)]
print(f"点数順: {sorted_names}")
実行結果
平均点: 77.5点
平均点以上: {'次郎': 88, '美咲': 92}
点数順: ['美咲', '次郎', '太郎', '花子']
💡 lambda式について
lambda x: x[1]は「xの1番目の要素を返す」という意味の無名関数です。
scores.items()は(名前, 点数)のタプルを返すので、x[1]は点数になります。
lambda式は関数の章で詳しく学びます。
📌 内包表記を使うべき場面・避けるべき場面
| 使うべき場面 | 避けるべき場面 |
| シンプルな変換やフィルタリング | 複雑な条件分岐がある時 |
| 1行で読める程度の処理 | 入れ子が2段階以上になる時 |
| リスト/辞書/セットを作る時 | 副作用(print等)がある処理 |
📝 練習問題(10問)
ここまで学んだことを実際に手を動かして確認しましょう。
問題1:1から20までの数字(初級)
📋 問題
リスト内包表記を使って、1から20までの数字のリストを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# [i for i in range(1, 21)] で1から20までの数字を生成
numbers = [i for i in range(1, 21)]
print(numbers)
実行結果
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
問題2:3の倍数(初級)
📋 問題
1から30までの数字の中で、3の倍数だけのリストを作りましょう。
解答を見る
コード(条件付き内包表記)
※スマートフォンでは横スクロールできます
# if i % 3 == 0 → 3で割り切れる数だけ
multiples_of_3 = [i for i in range(1, 31) if i % 3 == 0]
print(multiples_of_3)
実行結果
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
💡 別解(range のステップを使う)
※スマートフォンでは横スクロールできます
# range(3, 31, 3) → 3から30まで3ずつ増える
multiples_of_3 = [i for i in range(3, 31, 3)]
print(multiples_of_3)
問題3:文字列を小文字に(初級)
📋 問題
リスト[“HELLO”, “WORLD”, “PYTHON”]の各要素を小文字に変換したリストを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
words = ["HELLO", "WORLD", "PYTHON"]
# word.lower() → 各単語を小文字に変換
lower_words = [word.lower() for word in words]
print(lower_words)
実行結果
['hello', 'world', 'python']
問題4:リストの要素を10倍(中級)
📋 問題
リスト[1, 2, 3, 4, 5]の各要素を10倍にしたリストを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
numbers = [1, 2, 3, 4, 5]
# n * 10 → 各要素を10倍にする
multiplied = [n * 10 for n in numbers]
print(multiplied)
実行結果
[10, 20, 30, 40, 50]
問題5:奇数を2倍、偶数はそのまま(中級)
📋 問題
リスト[1, 2, 3, 4, 5, 6]で、奇数は2倍、偶数はそのままのリストを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
numbers = [1, 2, 3, 4, 5, 6]
# n * 2 if n % 2 == 1 else n
# → 奇数(n % 2 == 1)なら2倍、そうでなければそのまま
result = [n * 2 if n % 2 == 1 else n for n in numbers]
print(result)
実行結果
[2, 2, 6, 4, 10, 6]
問題6:文字数が5以上の単語(中級)
📋 問題
リスト[“cat”, “elephant”, “dog”, “giraffe”, “fox”]から、文字数が5以上の単語だけのリストを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
words = ["cat", "elephant", "dog", "giraffe", "fox"]
# if len(word) >= 5 → 文字数が5以上の場合だけ
long_words = [word for word in words if len(word) >= 5]
print(long_words)
実行結果
['elephant', 'giraffe']
問題7:辞書 – 数字とその3乗(中級)
📋 問題
1から5までの数字をキー、その3乗を値とする辞書を作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# {i: i**3} → キーがi、値がiの3乗
cubes = {i: i**3 for i in range(1, 6)}
print(cubes)
実行結果
{1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
問題8:100以下の完全平方数(上級)
📋 問題
100以下の完全平方数(1, 4, 9, 16, 25…)のリストを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
# i**2 <= 100 → 2乗が100以下の場合だけ
# 1の2乗=1, 2の2乗=4, ..., 10の2乗=100
perfect_squares = [i**2 for i in range(1, 11) if i**2 <= 100]
print(perfect_squares)
実行結果
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
💡 別解(シンプル版)
※スマートフォンでは横スクロールできます
# 10の2乗が100なので、1から10まで2乗すればOK
perfect_squares = [i**2 for i in range(1, 11)]
print(perfect_squares)
問題9:母音だけ取り出す(上級)
📋 問題
文字列”Hello World”から、母音(a, e, i, o, u)だけを取り出したリストを作りましょう。(大文字小文字は区別しない)
解答を見る
コード
※スマートフォンでは横スクロールできます
text = "Hello World"
# char.lower() in "aeiou" → 小文字にして母音かチェック
vowels = [char for char in text if char.lower() in "aeiou"]
print(vowels)
実行結果
['e', 'o', 'o']
問題10:成績の統計(上級)
📋 問題
辞書 scores = {“太郎”: 75, “花子”: 55, “次郎”: 88, “美咲”: 92} から:
1. 平均点以上の人の辞書
2. 全員の名前のリスト(点数順・高い順)
を内包表記で作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
scores = {"太郎": 75, "花子": 55, "次郎": 88, "美咲": 92}
# 平均点を計算
average = sum(scores.values()) / len(scores)
print(f"平均点: {average}点")
# 1. 平均点以上の人の辞書
above_average = {name: score for name, score in scores.items()
if score >= average}
print(f"平均点以上: {above_average}")
# 2. 点数順(高い順)の名前リスト
# sorted() で点数順にソートし、名前だけを取り出す
sorted_names = [name for name, score in
sorted(scores.items(), key=lambda x: x[1], reverse=True)]
print(f"点数順: {sorted_names}")
実行結果
平均点: 77.5点
平均点以上: {'次郎': 88, '美咲': 92}
点数順: ['美咲', '次郎', '太郎', '花子']
❓ よくある質問
Q1: 内包表記は必ず使わないとダメ?
いいえ、必須ではありません。
通常のfor文でも全く問題ありません。
内包表記は便利ですが、読みにくくなるなら使わなくてOKです。
「読みやすさ」が最も大切です。
Q2: 条件のifはどこに書く?
フィルタリング(要素を選ぶ):ifは最後
[x for x in list if 条件]
値の変換(if-else):if-elseは式の前
[式1 if 条件 else 式2 for x in list]
位置が違うので注意しましょう!
Q3: 内包表記の方が速い?
少し速いですが、体感できるほどの差はありません。
速度より読みやすさを優先しましょう。
大量のデータを処理する時だけ、速度を意識すればOKです。
Q4: セットの内包表記もできる?
はい!リストの[ ]を{ }に変えるだけです。
{x for x in list} → セットが作られます
重複は自動的に除去されます。
Q5: 複雑な内包表記は避けるべき?
はい。内包表記が2行以上になりそうなら、通常のfor文を使った方が読みやすいです。
「短い」より「分かりやすい」が大切です!
目安として、1行で読めない内包表記は複雑すぎます。
🎉 ステップ15のまとめ
✅ このステップで学んだこと
✓ リスト内包表記:[式 for x in list]
✓ 条件付き(フィルタリング):[式 for x in list if 条件]
✓ if-else付き(値の変換):[式1 if 条件 else 式2 for x in list]
✓ 辞書内包表記:{key: value for x in list}
✓ セット内包表記:{式 for x in list}
✓ 複雑すぎる時は通常のfor文を使おう!
💪 次のステップへ
内包表記をマスターしました!
これで、リストや辞書を簡潔に作れるようになりました。
制御構文編はここまでです。
次のステップでは、関数について学びます。
コードを部品化して、再利用できるようになりますよ!
学習メモ
Pythonプログラミング基礎 - Step 15