用語比較
内包表記のifの位置の違い|末尾のif句(絞り込み)と先頭のif-else(値の切り替え)
リスト内包表記では、if が書ける場所が2つあります。for句の後ろに置く if句と、先頭の式の中に置く x if C else y という条件式です。見た目は似ていますが、役割がまったく違います。
末尾のif句は、要素を残すかどうかを決めます。先頭の条件式は、残した要素の値を選びます。[n for n in nums if n % 2 == 0] は偶数だけを集め、[n if n % 2 == 0 else 0 for n in nums] は全要素を残して奇数を0に置き換えます。
Python 3 エンジニア認定基礎試験では、コードの実行結果を読み取る問題が出題されるため、内包表記の結果を読み取る力が必要です。ifの位置を見分けられれば、結果の要素数と中身を取り違えません。公式のPython言語リファレンスは、内包表記のfor節とif節を左から右へ入れ子のブロックとして評価すると述べています。
このページは、「else を書きたいのに SyntaxError になる」人や、「ifを付けたのに要素数が減らない」人を対象にしています。for句が複数ある内包表記の読み方や、for文との書き比べは、別のページで扱います。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。
結論
末尾のif句
for句の後ろに置く。条件が真の要素だけを残し、偽の要素は捨てる。elseは書けず、結果の要素数が元より減ることがある。
先頭の条件式(x if C else y)
先頭の式として置く。Cが真ならx、偽ならyを要素の値にする。elseが必須で、要素数は元のまま変わらない。
違いを表で確認
| 比較軸 | 末尾のif句 | 先頭の条件式(x if C else y) |
|---|---|---|
| 書く位置 | for句の後ろ。[n for n in nums if n % 2 == 0] | 先頭の式。[n if n % 2 == 0 else 0 for n in nums] |
| 役割 | 要素を残すか捨てるかの絞り込み | 各要素の値をどちらにするかの切り替え |
| else | 書けない。書くとSyntaxErrorになる | 必須。elseを省くとSyntaxErrorになる |
| 結果の要素数 | 元より減ることがある(nums が6個のとき偶数だけで3個) | 元と同じ(6個のまま) |
| [1, 2, 3, 4, 5, 6] の結果 | [2, 4, 6] | [0, 2, 0, 4, 0, 6] |
| 試験で探す語 | for句の直後のif | 式の先頭の if と else |
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
どこで迷っているかを切り分ける
ifを付けたのに、要素が置き換わるだけで減らないと思っている人
for句の後ろのif句は、条件が偽の要素を結果に入れません。置き換えではなく取り除きです。要素数を問う問題では、まず if句の位置を確かめ、後ろにあれば元の要素数以下になると考えます。
偽のときに別の値を入れたくて、末尾に else を書いてしまう人
末尾のif句にはelseを付けられず、SyntaxErrorになります。偽のときに別の値を入れたいなら、条件式を先頭の式に移し、[n if 条件 else 別の値 for n in nums] の形に直します。
先頭の条件式と末尾のif句を、両方使えると知らない人
両方を組み合わせることもできます。[("big" if n > 3 else "small") for n in nums if n % 2 == 1] は、まず末尾のif句で奇数だけを残し、残った要素の値を先頭の条件式で選びます。丸括弧で囲むと、先頭の条件式の範囲が見やすくなります。
具体例で使い分ける
例 1
nums = [1, 2, 3, 4, 5, 6] に対し [n for n in nums if n % 2 == 0] の結果を問われる場合
末尾にif句だけを持つ内包表記の結果を読み取ります。
- for句はnumsの要素を1つずつnに入れます。
- if句の n % 2 == 0 が真になる2、4、6だけが残ります。
- 先頭の式はnだけなので、残った要素がそのまま並びます。
結論: 結果は[2, 4, 6]で、元の6個から3個に減ります。
例 2
同じnumsに対し [n if n % 2 == 0 else 0 for n in nums] の結果を問われる場合
先頭に条件式を持つ内包表記の結果を読み取ります。
- for句はnumsの全要素を1つずつnに入れます。末尾にif句は無いので、要素は捨てられません。
- 先頭の式は、リファレンスのとおり、最初に条件 n % 2 == 0 を評価します。真ならn、偽なら0が要素になります。
- 1から順に0、2、0、4、0、6が並びます。
結論: 結果は[0, 2, 0, 4, 0, 6]で、要素数は元と同じ6個です。
例 3
[("big" if n > 3 else "small") for n in nums if n % 2 == 1] の結果を問われる場合
末尾のif句と先頭の条件式が両方ある内包表記を読み取ります。
- 末尾のif句 n % 2 == 1 で、numsから奇数の1、3、5だけが残ります。
- 残った1、3、5に対し、先頭の条件式 n > 3 を評価します。1と3は偽で "small"、5は真で "big" です。
結論: 結果は['small', 'small', 'big']で、要素数は絞り込み後の3個です。
問題文から答えを選ぶ手順
- 1
ifがどこにあるかを見る
for句の後ろにあるか、先頭の式の中にあるか(x if C else yの形)を確かめます。両方あることもあります。
- 2
末尾のif句で残る要素を決める
末尾にif句があれば、for句の値のうち条件が真のものだけを残します。
- 3
先頭の条件式で値を決める
先頭にif-elseがあれば、残った各要素について条件を評価し、真なら前の値、偽ならelseの後の値を要素にします。
- 4
要素数を確かめる
要素数は末尾のif句の絞り込み後の数です。先頭の条件式だけなら元と同じ数になります。
試験での見分け方
- 1末尾のif句は、条件が偽の要素を結果に入れない。elseは付けられない。
- 2先頭の x if C else y は、Cを最初に評価し、真ならx、偽ならyを要素の値にする。elseは必須。
- 3先頭の条件式だけなら、要素数は for句が取り出した数と同じになる。
- 4内包表記のfor節とif節は、リファレンスのとおり左から右へ入れ子のブロックとして評価される。
- 5両方を使うときは、末尾のif句で残す要素を決めてから、先頭の条件式で値を選ぶ。
誤答しやすい選択肢
[n for n in nums if n % 2 == 0 else 0] のように末尾にelseを書く
修正: 末尾のif句にelseは付けられず、SyntaxErrorになります。偽のときの値を決めたいなら、[n if n % 2 == 0 else 0 for n in nums] のように条件式を先頭へ移します。
[n if n % 2 == 0 for n in nums] のようにelseを省く
修正: 先頭の条件式はelseが必須で、省くとSyntaxErrorになります。偶数だけを集めたいなら、条件を末尾のif句に移し、[n for n in nums if n % 2 == 0] と書きます。
先頭の条件式を使って、要素が減ると思う
修正: 先頭の条件式は、値を選ぶだけで、要素を捨てません。[n if n % 2 == 0 else 0 for n in nums] は、6個の入力から6個の結果になります。
if句が2つ並ぶと、片方が先頭の条件式だと思う
修正: [n for n in nums if n > 1 if n < 5] のように末尾にif句が2つ続くのは、条件を両方満たす要素だけを残す書き方です。結果は[2, 3, 4]で、どちらも絞り込みです。
確認問題
Q1[x for x in [-2, 3, -1] if x > 0] の結果は何ですか?
答え: [3]
末尾のif句 x > 0 が真になるのは3だけで、-2と-1は結果に入りません。
Q2[x if x > 0 else -x for x in [-2, 3, -1]] の結果は何ですか?
答え: [2, 3, 1]
先頭の条件式で、x > 0 なら x、そうでなければ -x が要素になります。-2は2、3は3、-1は1になり、要素数は3個のままです。
Q3偶数はそのまま、奇数は0に置き換えたリストを内包表記で作るとき、ifとelseは式のどこに書きますか?
答え: 先頭の式の中(n if n % 2 == 0 else 0 for n in nums)
値を選ぶ切り替えは先頭の条件式で行います。末尾のif句にはelseを書けず、書くとSyntaxErrorになります。
到達チェック
- 末尾のif句と先頭の条件式の役割の違いを言える
- 末尾のif句にelseを付けるとSyntaxErrorになると説明できる
- 先頭の条件式にelseが必須だと説明できる
- 結果の要素数が減るのはどちらの書き方か判定できる
- 両方を使った内包表記の結果を、2段階で読み取れる
関連ページで確認する
同じ資格で次に知りたいこと
- 例外処理の try/except と if による事前確認の違い
Pythonの try/except(例外処理)と if による事前確認の違いを、処理の流れ、書き方の名前(EAFPとLBYL)、競合状態の注意点、Python3基礎試験での判断手順と確認問題まで解説します。
- for文とwhile文の使い分け
Pythonの for 文と while 文の違いを、繰り返しの終わり方、range()、else節、break と continue の動き、Python3基礎試験での判断手順と確認問題まで解説します。
- ミュータブルとイミュータブルの違い|リスト・タプル・文字列の変更と代入をPython3エンジニア認定基礎試験で判断する
ミュータブル(変更できる)とイミュータブル(変更できない)の違いを、リスト・タプル・文字列の公式チュートリアルの記述、代入で参照が共有される動き、スライスによる浅いコピー、確認問題つきで整理します。
よくある質問
Q内包表記でif-elseを使うにはどう書きますか?
先頭の式の位置に x if 条件 else y の形で書きます。例は [n if n % 2 == 0 else 0 for n in nums] で、偶数はそのまま、奇数は0になります。
Q内包表記の末尾にelseを書くとどうなりますか?
文法エラー(SyntaxError)になります。末尾のif句は絞り込み専用で、elseは付けられません。
Q内包表記のif句は、要素数を変えますか?
末尾のif句は、条件が偽の要素を取り除くので、要素数が減ることがあります。先頭の条件式は値を選ぶだけで、要素数を変えません。
Q先頭の条件式と末尾のif句は、同時に使えますか?
使えます。末尾のif句で残す要素を決め、残った各要素の値を先頭の条件式で選びます。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: ミナト編集部(運営者情報を見る)
