ステップ15:内包表記

✨ ステップ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

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE