Python 3 エンジニア認定基礎試験 想定問題集
データ構造の要点整理と想定問題
公式の出題範囲の「5章 データ構造」にあたる分野です。まず要点整理で全体をつかみ、下の演習で 52 問を 1 問ずつ解けます。答えると A〜D すべての解説が出ます。
この分野の小項目
- 5.1 リストのメソッド(5 問) list.append()・extend()・insert()・remove()・pop()・clear()・index()・count()・sort()・reverse()・copy() の動き。insert や remove、sort のように内容を変えるメソッドは None を返す。要素が無いときの remove()・index() は ValueError。比較できない型が混じると sort() はできない。
- 5.1.1・5.1.2 リストをスタック・キューとして使う(4 問) append() と引数なしの pop() でスタック(後入れ先出し)として使える。キュー(先入れ先出し)にリストを使うと先頭の挿入・削除が遅いため、両端の追加・取り出しが速い collections.deque を使う。
- 5.1.3・5.1.4 リスト内包表記(入れ子を含む)(7 問) 角括弧の中に式・for 節・0 個以上の for 節や if 節を書いてリストを作る。ループで作るより簡潔で、ループ変数が外に残らない。式がタプルなら丸括弧が必要。内包表記の先頭の式に別の内包表記を書けば行列の転置などができ、実務では zip() が便利。
- 5.2 del 文(4 問) del はインデックスを指定して要素を削除する(値を返す pop() と違い値を返さない)。スライスの削除やリスト全体の中身の削除、変数そのものの削除にも使え、削除後に変数を参照するとエラーになる。
- 5.3 タプルとシーケンス・パックとアンパック(5 問) タプルはコンマで区切った値の並びで不変(要素に可変オブジェクトは含められる)。空のタプルは ()、要素 1 つのタプルは値の後ろにコンマを付ける。t = 1, 2, 3 はタプルのパック、x, y, z = t はシーケンスのアンパックで、左辺の変数の数と要素数が一致する必要がある。
- 5.4 集合型(set)(5 問) 集合は重複しない要素を順序なしで集めたもの。所属判定や重複の除去に使い、和・差・積・対称差の演算ができる。波括弧か set() で作るが、空の集合は set() で作る({} は空の辞書)。集合の内包表記も書ける。
- 5.5 辞書型(dict)(6 問) 辞書はキーと値の組を持ち、キーには文字列や数値など不変の型を使う(可変オブジェクトを含むタプルやリストは使えない)。同じキーへの代入は上書き、存在しないキーの参照は KeyError、del で削除できる。list(d) は挿入順のキーのリスト、in でキーの有無を調べる。dict() コンストラクタや辞書の内包表記でも作れる。
- 5.6 ループのテクニック(6 問) 辞書は items() でキーと値を同時に取り出せる。enumerate() で位置と値、zip() で複数のシーケンスを組にして反復する。逆順は reversed()、並べ替えは元を変えない sorted()、重複を除いて並べるなら sorted(set(...))。反復中のリスト変更は避け、新しいリストを作るほうが簡単で安全。
- 5.7 条件についてもう少し(in・is・ブール演算・代入式)(6 問) in / not in は値がコンテナに含まれるか、is / is not は 2 つが同じオブジェクトかを調べる。比較は連鎖でき(a < b == c)、and・or・not で組み合わせる。and と or は短絡演算子で、評価は左から右で結果が決まると止まり、最後に評価した値を返す。式の中での代入は代入式(:=)を明示的に使う。
- 5.8 シーケンスの比較(4 問) 同じシーケンス型どうしは辞書式順序で比較する(先頭から順に比べ、片方が他方の先頭部分なら短いほうが小さい)。文字列は Unicode のコードポイント順。異なる型の比較は、適切な比較メソッドがあれば可能(例: 数値型どうし)で、無ければ TypeError。
要点整理
リストのメソッド
リストのメソッド:戻り値と例外をセットで覚える
リストのメソッドは「何を返すか」と「失敗したら何が起きるか」がよく問われます。中身を書き換える insert()・remove()・sort() などは None を返します。b = a.sort() と書くと b は None になり、並べ替わるのは a そのものです。
append() は要素を 1 つ足し、extend() はイテラブルの要素を 1 つずつ足します。a.append([3, 4]) はリスト 1 つを要素として入れるので入れ子になります。
remove() は値が等しい最初の 1 つだけを消し、見つからなければ ValueError です。index() も見つからなければ ValueError で、第 2 引数で探し始める位置を指定しても、返す位置はリスト全体の先頭から数えます。
None と文字列のように比べられない値が混じったリストは sort() できず、TypeError になります。
| メソッド | 動き | 戻り値・注意点 |
|---|---|---|
| append() | 末尾に要素を 1 つ追加 | None |
| extend() | イテラブルの全要素を末尾に追加 | None |
| insert() | 指定位置に挿入(insert(0, x) は先頭) | None |
| remove() | 等しい最初の要素を削除 | 無ければ ValueError |
| pop() | 指定位置(省略時は末尾)を取り出す | 取り出した値。範囲外は IndexError |
| clear() | 全要素を削除(del a[:] と同じ) | None |
| index() | 等しい最初の要素の位置 | 無ければ ValueError |
| count() | 等しい要素の個数 | 整数(無ければ 0) |
| sort()・reverse() | その場で並べ替え・逆順 | None |
| copy() | 浅いコピーを作る(a[:] と同じ) | 新しいリスト |
リストをスタック・キューとして使う
スタックはリスト、キューは deque
スタック(後入れ先出し)はリストの append() と引数なしの pop() で作れます。どちらも末尾を操作するので速く動きます。
キュー(先入れ先出し)もリストで作れますが、効率はよくありません。先頭での挿入や取り出しは、他の要素を 1 つずつずらす必要があるからです。
キューには collections.deque を使います。append() で末尾に足し、popleft() で先頭から取り出します。両端での追加と取り出しが速いのが特徴です。
出典: Python チュートリアル 5.1.1 リストをスタックとして使う/Python チュートリアル 5.1.2 リストをキューとして使う
リスト内包表記(入れ子を含む)
リスト内包表記:for 節は左から外側、ループ変数は残らない
リスト内包表記は、角括弧の中に式・for 節・0 個以上の for 節や if 節を書きます。[x**2 for x in range(10)] のように書けば、for 文で append() するより短く書けます。
for 文で作るとループ変数がループ後も残りますが、内包表記では外に残りません。内包表記の後でループ変数を参照すると NameError になります。
for 節が 2 つあるときは、左が外側のループ、右が内側のループです。[n for e in vec for n in e] で入れ子のリストを平らにできます。
式がタプルのときは丸括弧が必要です。[x, x**2 for x in range(3)] は SyntaxError で、[(x, x**2) for x in range(3)] と書きます。
Web 版のチュートリアル(Python 3.15)には [*e for e in vec] のように内包表記の中で * を使って平らにする書き方(5.1.5)も載っています。これは 3.15 で加わった機能で、3.14 以前では SyntaxError になります。
先頭の式に別の内包表記を書くと、行列の行と列を入れ替えられます。外側を for i in range(列数)、先頭の式を [row[i] for row in m] にするのがその形です。実務では list(zip(*m)) が便利で、こちらは組がタプルになります。
出典: Python チュートリアル 5.1.3 リスト内包表記/Python チュートリアル 5.1.4 ネストしたリストの内包表記/What's New In Python 3.15(PEP 798: Unpacking in comprehensions)
del 文
del 文:値は返さず、名前ごと消すこともできる
del 文はインデックスやスライスで要素を消します。値を返す pop() との違いは、値を返さないことです。
del a[2:4] は位置 2 と 3 を消し、終わりの位置は含みません。del a[:] は中身をすべて消し、a は空のリストとして残ります。
del a は変数そのものを消します。再び代入するまで a を参照すると NameError です。ただし消えるのは名前の結び付きだけで、b = a のように別の名前が指していたリストは b から使えます。
| 書き方 | 消すもの | 戻り値・その後 |
|---|---|---|
| del a[0] | 位置 0 の要素 | 値は返さない |
| a.pop(0) | 位置 0 の要素 | 取り出した値を返す |
| a.remove(x) | x と等しい最初の要素 | 無ければ ValueError |
| del a[:] | 中身すべて | a は [] として残る |
| del a | 変数 a そのもの | 参照すると NameError |
タプルとシーケンス・パックとアンパック
タプル:不変だが、中のリストは変えられる
タプルはコンマで区切った値の並びで、イミュータブルです。t[0] = 1 のような要素への代入は TypeError になります。ただし要素にリストのようなミュータブルなオブジェクトを含めることはでき、そのリストの中身は変えられます。
空のタプルは ()、要素 1 つのタプルは 'hello', のように値の後ろにコンマを付けます。('hello') は丸括弧で囲んだだけの文字列です。
t = 1, 2, 3 はタプルのパック、x, y, z = t はシーケンスアンパックです。左辺の変数の数と右辺の要素数が合わないと ValueError になります。タプルは入れ子にでき、入れ子のタプルは 1 つの要素として数えます。
集合型(set)
集合:重複を除き、4 つの演算を記号で覚える
集合は重複しない要素を順序なしで集めたものです。主な用途は、要素が含まれるかの判定と、重複の除去です。
波括弧か set() で作りますが、空の集合は必ず set() です。{} は空の辞書になります。
{c for c in 'abracadabra' if c not in 'abc'} のような集合の内包表記も書けます。集合には順序が無いので、並べて表示したいときは sorted() でリストにします。
| 演算 | 記号 | 得られるもの |
|---|---|---|
| 和 | a | b | a か b のどちらか(または両方)にある要素 |
| 積 | a & b | a と b の両方にある要素 |
| 差 | a - b | a にあって b に無い要素 |
| 対称差 | a ^ b | どちらか一方だけにある要素 |
辞書型(dict)
辞書:キーは不変の型、in はキーを調べる
辞書はキーと値の組を集めた型で、キーには文字列や数値など不変の型を使います。タプルは文字列・数値・タプルだけを含むならキーにできますが、リストを含むタプルやリストそのものは使えません。
同じキーに代入すると前の値は上書きされます。存在しないキーを d[key] で参照すると KeyError で、get() なら None が返ります。del d[key] で組を消せます。
list(d) は挿入順のキーのリスト、sorted(d) はキーを並べたリストです。in 演算子が調べるのはキーで、値ではありません。
dict() にキーと値のタプルのリストを渡しても作れます。キーが単純な文字列なら dict(sape=4139) のようにキーワード引数でも作れます。{x: x**2 for x in (2, 4, 6)} は辞書の内包表記です。
ループのテクニック
ループのテクニック:目的ごとに関数を選ぶ
ループで何を同時に取り出したいかで、使う関数が決まります。下の表で選び分けを覚えましょう。
sorted() は元のデータを変えずに新しいリストを返します。リストの sort() は元を書き換え、None を返す点と区別します。
反復中にそのリストを変えたくなったら、新しいリストを作る方が簡単で安全なことが多い、とチュートリアルは述べています。
| やりたいこと | 書き方 |
|---|---|
| 辞書のキーと値を同時に | for k, v in d.items() |
| 位置と値を同時に | for i, v in enumerate()(seq) |
| 2 つのシーケンスを組にして | for a, b in zip()(s1, s2) |
| 逆順に | for x in reversed()(seq) |
| 並べ替えて(元は変えない) | for x in sorted()(seq) |
| 重複を除いて並べ替えて | for x in sorted(set(seq)) |
条件についてもう少し(in・is・ブール演算・代入式)
条件:and・or は最後に評価した値を返す
in と not in は値がコンテナに含まれるかを、is 演算子は 2 つが同じオブジェクトかを調べます。中身が同じ別のリストは == では True、is では False です。
比較は a < b == c のようにつなげられます(比較の連鎖)。a < b and b == c と同じ意味です。比較演算子はすべて同じ優先順位で、数値演算子より低い順位です。
and と or は左から評価し、結果が決まった時点で止まります(短絡評価)。返すのは True・False ではなく最後に評価した値です。'' or 'Tokyo' は 'Tokyo'、0 and 5 は 0 です。not だけは常に真偽値を返します。
ブール演算子の優先順位は not が最も高く、or が最も低い順です。True or False and False は True or (False and False) と読みます。
Python では式の中で = による代入はできません。式の中で代入するときは代入式 := を使います。
出典: Python チュートリアル 5.7 条件についてもう少し/Python 言語リファレンス 6.11 ブール演算/Python 言語リファレンス 6.12 代入式
シーケンスの比較
シーケンスの比較:先頭から 1 つずつ比べる
同じ型のシーケンスどうしは辞書式順序で比べます。先頭から順に比べ、違う要素が見つかればそこで決まります。片方が他方の先頭部分なら、短い方が小さくなります。
文字列は 1 文字ずつ Unicode のコードポイントの数値で比べます。大文字の 'B'(66)は小文字の 'a'(97)より小さいので、'apple' < 'Banana' は False です。
異なる型でも、数値型どうしのように比べ方が決まっていれば比較できます。比べ方が無い組み合わせの大小比較は TypeError です。リストとタプルの == は False を返し、< は TypeError になります。
| 式 | 結果 | 決め手 |
|---|---|---|
| (1, 2, 3) < (1, 2, 4) | True | 3 番目で 3 < 4 |
| (1, 2, 3, 4) < (1, 2, 4) | True | 長さより先に 3 番目で決まる |
| (1, 2) < (1, 2, -1) | True | 先頭部分なので短い方が小さい |
| (1, 2, 3) == (1.0, 2.0, 3.0) | True | 数値型どうしは値で比べる |
| [1, 2] < (1, 2, 3) | TypeError | リストとタプルに大小の比べ方は無い |
出典: Python チュートリアル 5.8 シーケンスとその他の型の比較/Python 言語リファレンス 6.10.1 値の比較
演習(52 問)
結果はこのブラウザに保存され、ハブの「自分の成績」と弱点モードに使われます。
第 1 問 / 52 問
問題を読み込んでいます…
全問と解説の一覧
正解と解説は折りたたんであります。先に自分で考えてから開いてください。
全 52 問
リストのメソッド
名簿のリスト members に、別のリスト new_members の要素を 1 つずつすべて末尾へ足したい。使うメソッドとして最も適切なものは?
A. members.insert(0, new_members) B. members.copy(new_members) C. members.extend(new_members) D. members.append(new_members)
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? 指定した位置に要素を 1 つ入れるメソッドです。 insert() は先頭にリスト 1 つを要素として入れるだけで、末尾には足さない。 【B(不正解)】 ? リストのコピーを作るメソッドです。 copy() は引数を取らず、浅いコピーを返す。引数を渡すと TypeError になる。 【C(正解)】 ? 引数で渡したイテラブルの中身で、リストを延長するメソッドです。 extend() はイテラブルの全要素をリストの末尾に追加する。a[len(a):] = iterable と同じ動きである。 【D(不正解)】 ? 末尾に要素を 1 つ追加するメソッドです。 append() では new_members というリスト 1 つが要素として末尾に入り、入れ子になる。
次のコードを実行したときの出力は? a = [3, 1, 2] b = a.sort() print(b)
A. [1, 2, 3] B. [3, 1, 2] C. TypeError が発生する D. None
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 並べ替えた後の並びです。 sort() は a 自体を並べ替えるが、戻り値はリストではない。print(a) なら [1, 2, 3] になる。 【B(不正解)】 ? 並べ替える前の並びです。 sort() は元の並びを返すのではなく、a そのものを書き換える。 【C(不正解)】 ? 不適切な型の値を扱ったときの例外です。 整数どうしは比べられるので、並べ替えでエラーは起きない。 【D(正解)】 ? 値が無いことを表すオブジェクトです。 insert・remove・sort のように中身を書き換えるメソッドは None を返す。実行すると None と表示される。
次のコードの出力は? stock = ['pen', 'ink', 'pad', 'ink', 'cup', 'ink'] print(stock.index('ink', 2))
A. 3 B. 1 C. 5 D. ValueError が発生する
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 先頭から 4 番目の要素の位置です。 第 2 引数の 2 は探し始める位置。位置 2 以降で最初の 'ink' は位置 3 にあり、返す添字はリスト全体の先頭から数える。実行結果は 3。 【B(不正解)】 ? 先頭から 2 番目の要素の位置です。 位置 1 の 'ink' は、探し始める位置 2 より前なので対象外になる。 【C(不正解)】 ? 最後の要素の位置です。 index() は範囲の中で最初に見つかった位置を返す。最後に現れる位置ではない。 【D(不正解)】 ? 値が見つからないときの例外です。 位置 2 以降にも 'ink' があるので例外は起きない。値が無いときは ValueError になる。
アンケート結果のリストに、未回答の None と文字列と数値が混じっている。例えば [None, 'hello', 10].sort() を実行するとどうなる?
A. すべてを文字列に変えてから並べ替える B. TypeError が発生する C. 数値・文字列・None の順に並ぶ D. None を除いて並べ替える
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 同じ型にそろえてから比べる動きです。 sort() は要素の型を変換しない。比べ方を変えたいときは key 引数に関数を渡す。 【B(正解)】 ? 不適切な型の値を扱ったときの例外です。 None と文字列のように比べられない組み合わせがあると並べ替えはできない。Python 3.13 では TypeError: '<' not supported between instances of 'str' and 'NoneType' となった。 【C(不正解)】 ? 型ごとにまとめて並べる動きです。 Python は型の違う値に勝手な順序を付けない。 【D(不正解)】 ? 比べられない値を飛ばす動きです。 sort() は要素を自動で除かない。
次のコードの出力は? a = [1, 2, 3, 2] a.remove(2) print(a)
A. [1, 2, 2] B. [1, 3, 2] C. [1, 3] D. [1, 2, 3]
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 位置 2 の要素を取り除いた結果です。 位置で消すのは pop(2) や del a[2]。remove() の引数は位置ではなく値である。 【B(正解)】 ? 値 2 を 1 つ取り除いた結果です。 remove() は値が等しい最初の要素を 1 つだけ削除する。実行結果は [1, 3, 2]。 【C(不正解)】 ? 値 2 をすべて取り除いた結果です。 remove() が消すのは最初に見つかった 1 つだけである。 【D(不正解)】 ? 末尾の要素を取り除いた結果です。 末尾を取り除くのは引数なしの pop() の動き。remove() は値で探す。
リストをスタック・キューとして使う
編集の取り消し履歴を、最後に入れたものから先に取り出す形で管理したい。リストで実現するときのメソッドの組み合わせは?
A. append() と引数なしの pop() B. insert(0, x) と remove(x) C. append() と pop(0) D. extend() と clear()
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 末尾に足し、末尾から取り出す組み合わせです。 末尾に足して末尾から取り出すので、後入れ先出しのスタックになる。 【B(不正解)】 ? 先頭に入れ、値を指定して消す組み合わせです。 remove() は値で探して消すだけで、取り出した値を返さない。 【C(不正解)】 ? 末尾に足し、先頭から取り出す組み合わせです。 先に入れたものから出るキューの動きになる。しかもリストの先頭からの取り出しは遅い。 【D(不正解)】 ? まとめて足し、すべて消す組み合わせです。 clear() は全要素を消すので、1 つずつ取り出せない。
出典: Python チュートリアル 5.1.1 リストをスタックとして使う/Python チュートリアル 5.1 リスト型についてもう少し
次のコードの出力は? stack = [3, 4, 5] stack.append(6) stack.append(7) stack.pop() stack.pop() print(stack)
A. [5, 6, 7] B. [3, 4, 5, 6] C. [3, 4] D. [3, 4, 5]
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 先頭から 2 つを取り除いた並びです。 引数なしの pop() は先頭ではなく末尾から取り出す。 【B(不正解)】 ? 末尾から 1 つだけ取り除いた並びです。 pop() は 2 回呼ばれているので、2 つ取り出される。 【C(不正解)】 ? 末尾から 3 つを取り除いた並びです。 取り出したのは後から足した 7 と 6 だけで、5 は残る。 【D(正解)】 ? 末尾から 2 つを取り除いた並びです。 6 と 7 を足した後、引数なしの pop() が末尾の 7、続いて 6 を取り出す。実行結果は [3, 4, 5]。
窓口の受付順に処理する待ち行列を作る。到着順に末尾へ足し、先頭から取り出す。件数が多くても速く動かすのに向く型は?
A. tuple を使い先頭の要素を順に消していく B. set を使い要素を足してから取り出す C. deque を使い popleft() で取り出す D. list を使い pop(0) で先頭から取り出す
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? 変更できないシーケンス型です。 タプルはイミュータブルなので、要素を足したり消したりできない。 【B(不正解)】 ? 重複しない要素を順序なしで集める型です。 集合には順序が無いので、到着順に取り出す用途に合わない。 【C(正解)】 ? collections モジュールにある、両端で要素を出し入れできる型です。 collections.deque は両端での追加と取り出しが速く、popleft() で先頭から取り出せる。チュートリアルもキューにはこれを使うよう案内している。 【D(不正解)】 ? リストの先頭の要素を取り出す方法です。 動くが、先頭を取り出すたびに残りの要素を 1 つずつずらすので遅い。
次のコードの出力は? from collections import deque q = deque(['A', 'B', 'C']) q.append('D') q.popleft() print(q.popleft(), list(q))
A. D ['B', 'C'] B. C ['D'] C. B ['C', 'D'] D. A ['B', 'C', 'D']
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? 'D' を表示する案です。 末尾から取り出すのは pop()。popleft() は先頭から取り出す。 【B(不正解)】 ? 'C' を表示する案です。 popleft() は 2 回しか呼ばれていないので、3 つ目までは取り出されない。 【C(正解)】 ? 'B' を表示する案です。 1 回目の popleft() で 'A'、print の中の 2 回目で 'B' が先頭から取り出される。残りは ['C', 'D'] で、実行結果は B ['C', 'D']。 【D(不正解)】 ? 'A' を表示する案です。 'A' は 4 行目の 1 回目の popleft() で既に取り出されている。
リスト内包表記(入れ子を含む)
次のリスト内包表記で作られるリストは? [x**2 for x in range(5)]
A. [0, 1, 4, 9, 16] B. [1, 4, 9, 16, 25] C. [0, 2, 4, 6, 8] D. [0, 1, 2, 3, 4]
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 0〜4 を 2 乗した並びです。 range(5) は 0〜4 を順に出し、先頭の式 x**2 でそれぞれ 2 乗する。実行結果は [0, 1, 4, 9, 16]。 【B(不正解)】 ? 1〜5 を 2 乗した並びです。 range(5) は 0 から始まり、5 は含まない。 【C(不正解)】 ? 0〜4 を 2 倍した並びです。 ** はべき乗。2 倍なら x*2 と書く。 【D(不正解)】 ? 0〜4 をそのまま並べたものです。 リスト内包表記では先頭の式 x**2 が各要素に適用される。
次のコードの出力は? print([(x, y) for x in [1, 2] for y in [2, 3] if x != y])
A. [(2, 1), (3, 1), (3, 2)] B. [(1, 2), (1, 3), (2, 3)] C. [(1, 2), (1, 3), (2, 2), (2, 3)] D. [(1, 2), (2, 3)]
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 左右を入れ替えた組のリストです。 式は (x, y) の順なので、x が左に来る。 【B(正解)】 ? 3 組のタプルを並べたリストです。 for 節と if 節は、書いた順の入れ子のループと条件と同じ。(2, 2) だけが除かれ、実行結果は [(1, 2), (1, 3), (2, 3)]。 【C(不正解)】 ? 4 組のタプルを並べたリストです。 if x != y の条件で (2, 2) は除かれる。 【D(不正解)】 ? 2 組のタプルを並べたリストです。 x = 1 のとき y = 2 と y = 3 の両方を試すので、組は 2 つより多い。
0〜2 の値とその 2 乗を組にしたリストを内包表記で作りたい。SyntaxError になる書き方は?
A. [(x, x**2) for x in range(3)] B. [{x: x**2} for x in range(3)] C. list(zip(range(3), [x**2 for x in range(3)])) D. [x, x**2 for x in range(3)]
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 式を丸括弧で囲んでタプルにする書き方です。 実行できる。結果は [(0, 0), (1, 1), (2, 4)]。 【B(不正解)】 ? 式を波括弧とコロンで辞書にする書き方です。 実行できる。結果は [{0: 0}, {1: 1}, {2: 4}] で、組ではなく辞書のリストになる。 【C(不正解)】 ? 2 つのイテラブルを組にする関数を使う書き方です。 実行できる。zip() がタプルの組を作り、結果は [(0, 0), (1, 1), (2, 4)]。 【D(正解)】 ? 式をコンマで並べ、丸括弧で囲まない書き方です。 式がタプルのときは丸括弧が要る。Python 3.13 では SyntaxError: did you forget parentheses around the comprehension target? となった。
次のコードの出力は? m = [ [1, 2, 3], [4, 5, 6], ] t = [ [row[i] for row in m] for i in range(3) ] print(t[1])
A. [1, 4] B. (2, 5) C. [2, 5] D. [4, 5, 6]
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? 要素 2 つで、1 から始まるリストです。 [1, 4] は t[0]。添字 1 は 2 番目の要素を指す。 【B(不正解)】 ? 要素 2 つのタプルです。 タプルの組になるのは list(zip(*m)) の場合。ここでは内側も角括弧なのでリストになる。 【C(正解)】 ? 要素 2 つのリストです。 外側の内包表記が i を 0〜2 で回し、内側が各行の i 番目を集めるので、行と列が入れ替わる。t[1] は各行の位置 1 を集めたもので、実行結果は [2, 5]。 【D(不正解)】 ? m の 2 行目と同じ並びです。 t は m の行を並べたものではなく、各行の同じ位置の要素を集めたものである。
a = [1, 2]、b = [3, 4]、vec = [a, b] とする。入れ子の vec を [1, 2, 3, 4] に平らにしたい。目的どおりに動く内包表記は?
A. [n for n in e for e in vec] B. [e for e in vec] C. [list(e) for e in vec] D. [n for e in vec for n in e]
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 内側の要素を先に回そうとする書き方です。 左の for 節が先に動くので、まだ無い e を使うことになる。e が未定義なら NameError になる。 【B(不正解)】 ? 外側のリストの要素をそのまま集める書き方です。 [1, 2] と [3, 4] がそのまま要素として入り、vec と同じ入れ子の形になる。 【C(不正解)】 ? 各要素をリストに変えて集める書き方です。 要素ごとに新しいリストを作るので、入れ子のままで平らにならない。 【D(正解)】 ? 外側のリストを先に、内側の要素を後に回す書き方です。 for 節は左から外側、内側の順に入れ子になる。実行結果は [1, 2, 3, 4]。
次のコードを Python 3 で実行するとどうなる? squares = [k**2 for k in range(3)] print(k)
A. [0, 1, 4] と表示される B. NameError が発生する C. 2 と表示される D. 4 と表示される
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 作ったリストの中身です。 リストが入っているのは squares で、k ではない。 【B(正解)】 ? 定義されていない名前を使ったときの例外です。 内包表記のループ変数は外に残らない(副作用が無い)。k は未定義なので NameError になる。 【C(不正解)】 ? ループの最後の値です。 for 文でリストを作った場合はループ後も変数が残るが、内包表記では残らない。 【D(不正解)】 ? 最後に計算した 2 乗の値です。 k は 2 乗の値ではなくループ変数で、しかも外には残らない。
行列 m の行と列を入れ替えたい。次のコードの出力は? m = [ [1, 2], [3, 4], [5, 6], ] print(list(zip(*m)))
A. [(1, 3, 5), (2, 4, 6)] B. [(2, 4, 6), (1, 3, 5)] C. [(1, 2), (3, 4), (5, 6)] D. [1, 3, 5, 2, 4, 6]
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 1 から始まるタプルが先に来るリストです。 *m で 3 つの行が別々の引数として渡り(引数のアンパック)、zip() が同じ位置の要素を組にする。実行結果は [(1, 3, 5), (2, 4, 6)]。 【B(不正解)】 ? 2 から始まるタプルが先に来るリストです。 zip() は先頭の位置から順に組にするので、(1, 3, 5) が先に来る。 【C(不正解)】 ? 元の行をタプルにしたものです。 zip() は各行の同じ位置の要素を組にするので、組になるのは列である。 【D(不正解)】 ? 1 次元に並べたリストです。 zip() は組(タプル)を作るので、平らなリストにはならない。
del 文
リストから要素を消すときの、del 文と pop() の違いの説明として適切なものは?
A. del はリスト全体しか消せず、pop() は 1 要素を消す B. del はタプルにも使え、pop() はリスト専用 C. del は値を返さず、pop() は取り除いた値を返す D. del は値で探し、pop() は位置で指定する
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? 消せる範囲に注目した説明です。 del は 1 要素・スライス・リストの中身全体・変数そのものを消せる。 【B(不正解)】 ? 使える型に注目した説明です。 タプルはイミュータブルで要素を消せない。del t[0] は TypeError になる。 【C(正解)】 ? 戻り値の有無に注目した説明です。 チュートリアルは、del 文は値を返さない点で pop() と違うと説明している。 【D(不正解)】 ? 削除の指定方法に注目した説明です。 del もインデックスやスライスで位置を指定する。値で探して消すのは remove()。
次のコードの出力は? a = [10, 20, 30, 40, 50] del a[1:3] print(a)
A. [10, 40, 50] B. [10, 50] C. [10, 20, 40, 50] D. [10, 30, 50]
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 位置 1 と 2 の要素を消した並びです。 スライス a[1:3] は位置 1 と 2 を指し、終わりの 3 は含まない。20 と 30 が消え、実行結果は [10, 40, 50]。 【B(不正解)】 ? 位置 1〜3 の要素を消した並びです。 スライスの終わりの位置 3 は削除の範囲に入らない。 【C(不正解)】 ? 位置 2 の要素だけを消した並びです。 a[1:3] は 2 つの要素を指すので、1 つだけでは済まない。 【D(不正解)】 ? 位置 1 と 3 の要素を消した並びです。 スライスは連続した範囲を指す。とびとびの要素は消さない。
リスト a の中身を空にしつつ、変数 a 自体は残したい。適切な書き方は?
A. del a B. a.pop() C. a.remove(a) D. del a[:]
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 変数そのものを削除する書き方です。 変数 a 自体が消える。再び代入するまで、a を参照すると NameError になる。 【B(不正解)】 ? 末尾の要素を 1 つ取り出す書き方です。 要素を 1 つ取り出すだけで、空になるのは要素が 1 つのときだけである。 【C(不正解)】 ? 引数と等しい要素を探して消す書き方です。 a 自身と等しい要素は無いので ValueError になる。 【D(正解)】 ? スライスで全要素を指定して削除する書き方です。 中身だけが消え、a は空のリスト [] として残る。clear() を使った a.clear() と同じ結果になる。
次のコードの出力は? a = [1, 2] b = a del a print(b)
A. None B. [1, 2] C. [] D. NameError が発生する
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 値が無いことを表すオブジェクトです。 del a は b に入っている参照を変えない。 【B(正解)】 ? b が指すリストの中身です。 名前の削除はその名前の束縛を取り除くだけで、b が指すリストは残る。実行結果は [1, 2]。 【C(不正解)】 ? 空のリストです。 del a はリストの中身を消す操作ではない。中身を消すなら del a[:]。 【D(不正解)】 ? 定義されていない名前を使ったときの例外です。 NameError になるのは消した a を参照したとき。b はまだ使える。
タプルとシーケンス・パックとアンパック
要素が 1 つだけのタプルを作る書き方は?
A. t = ('hello') B. t = ['hello'] C. t = {'hello'} D. t = 'hello',
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 値を丸括弧で囲むだけの書き方です。 丸括弧だけではタプルにならず、t は文字列 'hello' になる。 【B(不正解)】 ? 値を角括弧で囲む書き方です。 要素 1 つのリストになる。 【C(不正解)】 ? 値を波括弧で囲む書き方です。 要素 1 つの集合になる。 【D(正解)】 ? 値の後ろにコンマを付ける書き方です。 要素 1 つのタプルは値の後ろにコンマを付けて作る。len(t) は 1、表示は ('hello',)。
画面の大きさを t = (800, 600) のタプルで持っている。t[0] = 1024 を実行するとどうなる?
A. IndexError が発生する B. TypeError が発生する C. t が (1024, 600) になる D. 新しいタプルが作られ、t は元のまま残る
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 範囲外のインデックスを使ったときの例外です。 位置 0 は範囲内なので IndexError にはならない。 【B(正解)】 ? 不適切な型の操作をしたときの例外です。 タプルは不変なので要素へ代入できない。'tuple' object does not support item assignment と表示される。 【C(不正解)】 ? 先頭の要素を書き換えた結果です。 要素を書き換えられるのは、リストなどミュータブルな型である。 【D(不正解)】 ? 元を残して新しい値を作る動きです。 添字への代入で新しいタプルが作られることはない。
次のコードの出力は? v = ([1, 2], [3]) v[0].append(9) print(v)
A. ([1, 2, 9], [3]) B. TypeError が発生する C. ([1, 2], [3]) D. ([1, 2], [3], 9)
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 1 つ目のリストに 9 が加わった形です。 タプル自体は不変だが、要素に可変なリストを含められる。そのリストの中身は変えられ、実行結果は ([1, 2, 9], [3])。 【B(不正解)】 ? 不適切な型の操作をしたときの例外です。 タプルの要素を差し替えているのではなく、要素のリストを変えているので例外は起きない。 【C(不正解)】 ? 元のままの形です。 v[0] は v の中のリストそのもので、コピーではない。変更は v に反映される。 【D(不正解)】 ? タプルの末尾に 9 が加わった形です。 append() を呼んでいるのは v[0] のリスト。タプル v の要素数は変わらない。
次のコードを実行するとどうなる? x, y = 1, 2, 3
A. x が 1、y が 2 になり、3 は捨てられる B. x と y の両方に (1, 2, 3) が入る C. ValueError が発生する D. x が 1、y が (2, 3) になる
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? 余った要素を無視する動きです。 余った要素を黙って捨てることはせず、例外になる。 【B(不正解)】 ? 右辺全体を各変数に入れる動きです。 右辺はタプル (1, 2, 3) にパックされ、その要素を左辺の変数に順に分けようとする。 【C(正解)】 ? 値が不適切なときの例外です。 シーケンスアンパックでは、左辺の変数の数と右辺の要素数が一致する必要がある。Python 3.13 では too many values to unpack (expected 2) と表示された。 【D(不正解)】 ? 余りを最後の変数にまとめる動きです。 何も付けない変数に、余った要素が自動でまとめられることはない。
次のコードの出力は? t = 1, 'a', True u = t, (4, 5) print(len(u))
A. 5 B. 3 C. TypeError が発生する D. 2
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 中の値をすべて数えた値です。 入れ子のタプルは 1 つの要素として数え、中身までは平らにならない。 【B(不正解)】 ? t の要素数と同じ値です。 u の 1 つ目の要素が t であり、u の長さは t の長さとは別である。 【C(不正解)】 ? 不適切な型の操作をしたときの例外です。 タプルは入れ子にでき、len() も使えるのでエラーにはならない。 【D(正解)】 ? u をタプル 2 つの組とみた値です。 コンマで並べた t と (4, 5) がパックされ、u は要素 2 つのタプルになる。タプルは入れ子にでき、実行結果は 2。
集合型(set)
訪問済みの URL を記録する空の集合を作り、変数 seen に入れたい。適切な書き方は?
A. seen = [] B. seen = set() C. seen = {} D. seen = ()
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 角括弧だけを書く書き方です。 [] は空のリストになる。 【B(正解)】 ? set 型を引数なしで呼ぶ書き方です。 空の集合は set() で作る。 【C(不正解)】 ? 波括弧だけを書く書き方です。 {} は空の辞書になる。type({}) は dict である。 【D(不正解)】 ? 丸括弧だけを書く書き方です。 () は空のタプルになる。
次のコードの出力は? a = set('abracadabra') b = set('alacazam') print(sorted(a & b))
A. ['a', 'c'] B. ['b', 'd', 'r'] C. ['a', 'b', 'c', 'd', 'l', 'm', 'r', 'z'] D. ['b', 'd', 'l', 'm', 'r', 'z']
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 要素 2 つのリストです。 & は積で、両方にある要素を集める。'a' と 'c' だけが両方にあり、sorted() で並べると ['a', 'c']。 【B(不正解)】 ? 要素 3 つのリストです。 a にあって b に無い要素で、a - b の結果である。 【C(不正解)】 ? 要素 8 つのリストです。 どちらかにある要素で、a | b の結果である。 【D(不正解)】 ? 要素 6 つのリストです。 どちらか一方だけにある要素で、a ^ b(対称差)の結果である。
イベント参加者の名前のリスト names には重複がある。重複を除き、ある人が含まれるかを速く調べたい。適切な方法は?
A. names.sort() してから in で調べる B. list(reversed(names)) にしてから in で調べる C. set(names) にしてから in で調べる D. tuple(names) にしてから in で調べる
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? その場で並べ替える方法です。 並べ替えても重複は除かれない。sort() の戻り値は None である点にも注意する。 【B(不正解)】 ? 逆順に並べ直す方法です。 順番が逆になるだけで、重複は残る。 【C(正解)】 ? 組み込みの集合型に変換する方法です。 集合は重複を除き、所属の判定に向く。チュートリアルも基本の用途に所属判定と重複の除去を挙げている。 【D(不正解)】 ? 変更できないシーケンスに変える方法です。 タプルにしても重複は残る。
次のコードの出力は? print(sorted({c for c in 'abracadabra' if c not in 'abc'}))
A. ['a', 'b', 'c'] B. {'d', 'r'} C. ['d', 'r'] D. ['d', 'r', 'r']
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? 要素 3 つのリストです。 not in 'abc' の条件で a・b・c は除かれる。 【B(不正解)】 ? 集合のままの表示です。 sorted() は並べ替えた新しいリストを返すので、表示はリストの形になる。 【C(正解)】 ? 要素 2 つのリストです。 集合の内包表記で a・b・c 以外の文字を集め、重複は除かれる。sorted() で並べると ['d', 'r']。 【D(不正解)】 ? 'r' が 2 回入るリストです。 集合は重複を持たないので、'r' は 1 つになる。
今月の会員の集合 now と、先月の会員の集合 last がある。今月新しく加わった会員だけを求めたい。適切な式は?
A. now - last B. now & last C. now | last D. last - now
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 差(difference)を求める演算です。 now にあって last に無い要素が得られる。now = {'a', 'b', 'c'}、last = {'b', 'c', 'd'} で試すと {'a'} になった。 【B(不正解)】 ? 積(intersection)を求める演算です。 両方にいる会員、つまり継続している会員が得られる。 【C(不正解)】 ? 和(union)を求める演算です。 どちらかの月にいた会員すべてが得られる。 【D(不正解)】 ? last から now を引いた差を求める演算です。 先月いて今月いない、つまり抜けた会員が得られる。
辞書型(dict)
辞書のキーに使えないものは?
A. 42 B. [1, 2] C. (1, 2) D. 'tokyo'
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 整数です。 数値は不変なのでキーにできる。 【B(正解)】 ? 角括弧で作るシーケンスです。 リストは変更できるので辞書のキーに使えない。使うと TypeError: unhashable type: 'list' になる。 【C(不正解)】 ? 数値だけを含むタプルです。 文字列・数値・タプルだけを含むタプルはキーにできる。 【D(不正解)】 ? 文字列です。 文字列は不変なのでキーにできる。
次のコードの出力は? stock = {'pen': 3, 'ink': 5} stock['cup'] = 2 del stock['pen'] stock['pad'] = 7 print(list(stock))
A. ['cup', 'ink', 'pad'] B. [5, 2, 7] C. ['pen', 'ink', 'cup', 'pad'] D. ['ink', 'cup', 'pad']
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 'cup' から始まる並びです。 キーを昇順に並べるのは sorted(stock)。list() は挿入順のまま返す。 【B(不正解)】 ? 数値を並べたものです。 list(d) が返すのはキーで、値ではない。 【C(不正解)】 ? 4 つのキーの並びです。 del stock['pen'] でキー 'pen' と値の組は消えている。 【D(正解)】 ? 'ink' から始まる並びです。 list(d) は挿入順のキーのリストを返す。'pen' は del で消え、実行結果は ['ink', 'cup', 'pad']。
在庫の辞書 stock を、無いかもしれない商品名 name で調べる。キーが無いときは例外にせず None を得たい。適切な書き方は?
A. list(stock)[name] B. stock.get(name) C. stock[name] D. name in stock
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? キーのリストに添字を付ける書き方です。 list(stock) はキーのリスト。文字列を添字にすると TypeError になる。 【B(正解)】 ? キーで値を取り出すメソッドです。 get() はキーが無いとき例外を出さず None を返す。 【C(不正解)】 ? 角括弧でキーを指定する書き方です。 存在しないキーを参照すると KeyError になる。 【D(不正解)】 ? キーの有無を調べる演算です。 キーがあるかを True・False で返すだけで、値は得られない。
地点ごとの気温を辞書に記録したい。キーとして使ったときに TypeError になるものは?
A. (35, [139, 140]) B. (35, 139) C. (35, (139, 140)) D. '35-139'
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? リストを含むタプルです。 直接または間接に可変なオブジェクトを含むタプルはキーにできない。Python 3.13 では TypeError: unhashable type: 'list' となった。 【B(不正解)】 ? 数値だけを含むタプルです。 数値だけを含むタプルはキーにできる。 【C(不正解)】 ? タプルを含むタプルです。 文字列・数値・タプルだけを含むタプルはキーにできる。 【D(不正解)】 ? 文字列です。 文字列は不変なのでキーにできる。
次のコードの出力は? print({x: x**2 for x in (2, 4, 6)})
A. [(2, 4), (4, 16), (6, 36)] B. {4, 16, 36} C. {2: 4, 4: 16, 6: 36} D. {4: 2, 16: 4, 36: 6}
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? タプルのリストです。 波括弧で書いた内包表記なので、リストにはならない。 【B(不正解)】 ? 集合です。 キー: 値 の形で書いているので、集合ではなく辞書になる。 【C(正解)】 ? キーが 2・4・6 の辞書です。 辞書の内包表記は キー: 値 の形で書く。実行結果は {2: 4, 4: 16, 6: 36}。 【D(不正解)】 ? キーが 4・16・36 の辞書です。 コロンの左がキー、右が値。左右が逆になっている。
tel = {'jack': 4098, 'sape': 4139} のとき、4098 in tel の結果は?
A. True B. KeyError が発生する C. 'jack' D. False
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 真偽値の真です。 値の中に 4098 はあるが、in 演算子が見るのはキーだけである。 【B(不正解)】 ? 辞書に無いキーを参照したときの例外です。 in は参照ではなく判定なので、キーが無くても例外にならない。 【C(不正解)】 ? 4098 に対応するキーです。 in の結果は真偽値で、キーそのものは返さない。 【D(正解)】 ? 真偽値の偽です。 辞書に対する in はキーの有無を調べる。4098 は値でキーではないので False。
ループのテクニック
for 文でリストをたどるとき、位置(インデックス)と値を同時に取り出したい。使う組み込み関数は?
A. reversed() B. sorted() C. enumerate() D. zip()
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? シーケンスを逆順にたどる関数です。 reversed() は値を逆順に出すだけで、位置は付かない。 【B(不正解)】 ? 並べ替えた新しいリストを返す関数です。 sorted() は並べ替えるだけで、位置は付かない。 【C(正解)】 ? 要素に 0 からの番号を付けてたどる関数です。 enumerate() を使うと for i, v in enumerate(リスト) の形で位置と値を同時に取り出せる。 【D(不正解)】 ? 複数のイテラブルの要素を順に組にする関数です。 zip() は複数のシーケンスを組にする。位置の番号は付かない。
次のコードの出力は? prices = {'apple': 120, 'pear': 200} for k, v in prices.items(): print(k, v)
A. apple pear B. 120 200 C. ('apple', 120) ('pear', 200) D. apple 120 pear 200
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 文字だけが並ぶ形です。 items() はキーだけでなく値も一緒に返す。キーだけなら for k in prices と書く。 【B(不正解)】 ? 数値だけが並ぶ形です。 k にはキー、v には値が入り、両方を表示している。 【C(不正解)】 ? タプルの形で並ぶ形です。 組は k, v にアンパックされ、print(k, v) は空白区切りで表示する。タプルの形にはならない。 【D(正解)】 ? 1 行に文字と数値が並ぶ形です。 items() でキーと値の組を取り出し、k と v に分けて表示する。実行結果は apple 120、pear 200 の 2 行。
次のコードの出力は? for i in reversed(range(1, 10, 2)): print(i, end=' ')
A. 9 7 5 3 1 B. 1 3 5 7 9 C. 10 8 6 4 2 D. 9 8 7 6 5 4 3 2 1
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 9 から始まる 5 個の数です。 range(1, 10, 2) は 1, 3, 5, 7, 9。reversed() で逆順にたどり、9 7 5 3 1 と表示される(末尾に空白が 1 つ付く)。 【B(不正解)】 ? 1 から始まる 5 個の数です。 reversed() で逆順にたどるので、大きい方から表示される。 【C(不正解)】 ? 10 から始まる 5 個の数です。 range(1, 10, 2) は 1 から始まり、10 は含まない。 【D(不正解)】 ? 9 から始まる 9 個の数です。 range の第 3 引数 2 は増分なので、1 つおきの数になる。
注文のリスト orders = ['tea', 'coffee', 'tea', 'juice'] から、重複を除いた品名を ABC 順に得たい。orders は変えたくない。適切な式は?
A. set(sorted(orders)) B. sorted(set(orders)) C. orders.sort() D. sorted(orders)
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 並べ替えてから集合にする式です。 集合には順序が無いので、並べた順番が保たれない。 【B(正解)】 ? 集合にしてから並べ替えた新しいリストを作る式です。 重複を除いて並べるなら sorted(set(...)) を使う。元のリストは変わらず、結果は ['coffee', 'juice', 'tea']。 【C(不正解)】 ? リストをその場で並べ替えるメソッドです。 元の orders を書き換えるうえ、重複は残り、戻り値は None になる。 【D(不正解)】 ? 並べ替えた新しいリストを作る式です。 元は変わらないが、'tea' が 2 回残る。
センサー値のリスト data から欠測値の None を除きたい。チュートリアルの考え方に沿った、簡単で安全な方法は?
A. 新しいリストを作り、None でない値だけを append() する B. for x in data の中で、x が None なら data.remove(x) する C. data.sort() してから先頭を消す D. del data で消す
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 元のリストを残し、別のリストに集める方法です。 反復中にそのリストを変えるより、新しいリストを作る方が簡単で安全なことが多いとチュートリアルは述べている。 【B(不正解)】 ? たどっているリスト自体から消す方法です。 反復しながら同じリストを変えると見落としが出ることがある。[None, None, 1] で試すと [None, 1] が残った。 【C(不正解)】 ? 並べ替えてから先頭を消す方法です。 None と数値は比べられないので、sort() で TypeError になる。 【D(不正解)】 ? 変数そのものを消す方法です。 リストの名前ごと消え、必要な値まで使えなくなる。
次のコードの出力は? names = ['Ann', 'Bob'] scores = [80, 95] for n, s in zip(names, scores): print(n, s)
A. Ann Bob 80 95 B. ('Ann', 'Bob') (80, 95) C. Ann 95 Bob 80 D. Ann 80 Bob 95
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 1 行目に名前を並べた形です。 zip() は同じ位置どうしを組にするので、1 回のループで名前と点数が 1 組ずつ出る。 【B(不正解)】 ? タプルを 2 行表示した形です。 組は n, s にアンパックされ、空白区切りで表示される。 【C(不正解)】 ? 1 行目が Ann 95 の形です。 zip() は位置をずらさずに組にする。 【D(正解)】 ? 1 行目が Ann 80 の形です。 zip() は 2 つのリストの同じ位置の要素を組にする。実行結果は Ann 80、Bob 95 の 2 行。
条件についてもう少し(in・is・ブール演算・代入式)
a = [1, 2]、b = a、c = [1, 2] とする。結果が False になる式は?
A. a == c B. a == b C. a is c D. a is b
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? a と c の値が等しいかを調べる式です。 中身が等しいので True。 【B(不正解)】 ? a と b の値が等しいかを調べる式です。 同じオブジェクトで中身も等しいので True。 【C(正解)】 ? a と c が同じオブジェクトかを調べる式です。 is 演算子は同じオブジェクトかを調べる。c は値が同じ別のリストなので False。 【D(不正解)】 ? a と b が同じオブジェクトかを調べる式です。 b = a で同じオブジェクトを指すので True。
出典: Python チュートリアル 5.7 条件についてもう少し/Python 言語リファレンス 6.10.3 同一性の比較
次のコードの出力は? s1, s2, s3 = '', 'Tokyo', 'Osaka' print(s1 or s2 or s3)
A. Osaka B. Tokyo C. True D. (空の行)
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 3 番目の値です。 'Tokyo' が真なので評価はそこで止まり、'Osaka' は評価されない。 【B(正解)】 ? 2 番目の値です。 or は左から評価し、真の値が見つかった時点で止まってその値を返す(短絡評価)。空文字列は偽なので 'Tokyo' が返り、Tokyo と表示される。 【C(不正解)】 ? 真偽値の真です。 or は True・False に限らず、最後に評価した値を返す。 【D(不正解)】 ? 空文字列を表示する案です。 空文字列は偽なので、次の値の評価に進む。
出典: Python チュートリアル 5.7 条件についてもう少し/Python 言語リファレンス 6.11 ブール演算
次のコードの出力は? print(3 and 5, 0 and 5)
A. 5 0 B. True False C. 3 0 D. 3 5
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 数値 5 と 0 の組です。 x and y は、x が偽なら x を、そうでなければ y を返す。3 and 5 は 5、0 and 5 は 0 になる。 【B(不正解)】 ? 真偽値 2 つの組です。 and は True・False に限らず、評価した値をそのまま返す。 【C(不正解)】 ? 数値 3 と 0 の組です。 3 は真なので右側まで評価され、5 が返る。 【D(不正解)】 ? 数値 3 と 5 の組です。 0 は偽なので、その時点で 0 が返り、5 は評価しない。
次のコードの出力は? print(True or False and False)
A. None B. SyntaxError が発生する C. True D. False
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? 値が無いことを表すオブジェクトです。 この式の中に None は無く、None が返ることはない。 【B(不正解)】 ? 文法に合わない書き方をしたときの例外です。 and と or を混ぜて書くのは文法上問題ない。 【C(正解)】 ? 真偽値の真です。 ブール演算子では not が最も優先順位が高く、or が最も低い。True or (False and False) と評価され、実行結果は True。 【D(不正解)】 ? 真偽値の偽です。 左から (True or False) and False と計算すると False になるが、and の方が先に結び付く。
リストの長さを 1 回だけ計算し、条件の判定と表示の両方に使いたい。Python 3.8 以降で動く書き方は?
A. if (n = len(a)) > 3: print(n, '件') B. if n == len(a) > 3: print(n, '件') C. if len(a) > 3 as n: print(n, '件') D. if (n := len(a)) > 3: print(n, '件')
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 代入文の = を式の中に書く書き方です。 式の中で = による代入はできず SyntaxError になる。== との取り違えを防ぐためである。 【B(不正解)】 ? 等しいかを調べる演算子を使う書き方です。 == は比較で、代入はしない。n が未定義なら NameError になる。 【C(不正解)】 ? as で名前を付けようとする書き方です。 if 文の条件に as で名前を付ける文法は無く、SyntaxError になる。 【D(正解)】 ? 式の中で名前に値を入れる演算子を使う書き方です。 代入式 := は名前に代入しつつ、その値を返す。a = [1, 2, 3, 4, 5] で試すと 5 件 と表示された。
次のコードの出力は? print(1 < 2 == 2, 1 < 2 == 3)
A. False True B. True False C. False False D. True True
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 偽と真の組です。 1 < 2 と 2 == 2 はどちらも真なので、1 つ目は False にならない。 【B(正解)】 ? 真と偽の組です。 比較は連鎖でき(比較の連鎖)、a < b == c は a < b and b == c と同じ。1 つ目は True、2 つ目は 2 == 3 が偽なので False。 【C(不正解)】 ? 偽が 2 つの組です。 (1 < 2) を先に True にしてから True == 2 と比べると False になるが、連鎖した比較はそう計算しない。 【D(不正解)】 ? 真が 2 つの組です。 2 つ目は 2 == 3 が偽なので、True にはならない。
シーケンスの比較
シーケンスどうしの比較で、結果が False になる式は?
A. [1, 2, 3] < [1, 2] B. (1, 2, 3) < (1, 2, 4) C. (1, 2) < (1, 2, -1) D. (1, 2, 3, 4) < (1, 2, 4)
この問題へのリンク答えと解説
正解: A 【A(正解)】 ? 先頭 2 要素が同じで、左の方が長いリストどうしの比較です。 片方が他方の先頭部分なら、短い方が小さい。[1, 2] の方が小さいので False。 【B(不正解)】 ? 3 番目の要素だけが違うタプルどうしの比較です。 3 番目で 3 < 4 と決まるので True。 【C(不正解)】 ? 左が右の先頭部分になっているタプルどうしの比較です。 短い方が小さいので True。足された要素が負の数でも関係ない。 【D(不正解)】 ? 長さの違うタプルどうしの比較です。 3 番目で 3 < 4 と決まるので、長さに関係なく True。
次のコードの出力は? print('apple' < 'Banana')
A. None B. False C. True D. TypeError が発生する
この問題へのリンク答えと解説
正解: B 【A(不正解)】 ? 値が無いことを表すオブジェクトです。 比較の結果は真偽値で、None にはならない。 【B(正解)】 ? 真偽値の偽です。 文字列は Unicode のコードポイント順で比べる。'a' は 97、'B' は 66 なので 'apple' の方が大きく、False。 【C(不正解)】 ? 真偽値の真です。 大文字と小文字を区別しない順ならそうなるが、Python はコードポイントで比べる。 【D(不正解)】 ? 比べられない型どうしを比べたときの例外です。 文字列どうしは比較できる。
次のコードを実行するとどうなる? print([1, 2] == (1, 2)) print([1, 2] < (1, 2, 3))
A. True と表示された後、True と表示される B. False と表示された後、True と表示される C. 1 行目で TypeError が発生する D. False と表示された後、TypeError が発生する
この問題へのリンク答えと解説
正解: D 【A(不正解)】 ? 両方とも真という案です。 リストとタプルは要素が同じでも型が違うので、等しくない。 【B(不正解)】 ? 偽の後に真という案です。 リストとタプルの間に大小の比較は無く、2 行目は例外になる。 【C(不正解)】 ? 最初の比較で例外という案です。 == は型が違ってもエラーにならず、False を返す。 【D(正解)】 ? 1 行目は偽、2 行目で例外という案です。 型の違うシーケンスの等価比較は等しくないとなる。順序の比較は適切な比較メソッドが無いので TypeError になる。
出典: Python チュートリアル 5.8 シーケンスとその他の型の比較/Python 言語リファレンス 6.10.1 値の比較
(1, 2, 3) == (1.0, 2.0, 3.0) の結果は?
A. TypeError が発生する B. None C. True D. False
この問題へのリンク答えと解説
正解: C 【A(不正解)】 ? 比べられない型どうしを比べたときの例外です。 数値型どうしは比較できる。チュートリアルにも異なる数値型の比較の例がある。 【B(不正解)】 ? 値が無いことを表すオブジェクトです。 比較の結果は真偽値で、None にはならない。 【C(正解)】 ? 真偽値の真です。 数値型どうしは比べられ、1 と 1.0 は等しい。要素を順に比べてすべて等しいので True。 【D(不正解)】 ? 真偽値の偽です。 要素の型が int と float で違っても、値が等しければ等しいと判定される。
この分野に出てくる用語(51 語)
append():リストの末尾に要素を 1 つ追加するメソッド。
clear():リストの要素をすべて削除するメソッド。del a[:] と同じ結果になる。
collections.deque:両端での要素の追加と取り出しが速い、リストに似た型。キューの実装に向く。
copy():リストの浅いコピーを返すメソッド。a[:] と同じ結果になる。
count():リストの中で、指定した値と等しい要素の個数を返すメソッド。
del 文:インデックスやスライスで指定した要素、または変数そのものを削除する文。値は返さない。
enumerate():シーケンスの位置(インデックス)と値を組にして返す組み込み関数。
extend():イテラブルの全要素をリストの末尾に追加するメソッド。
get():辞書から値を取り出すメソッド。キーが無いときはエラーにせず None(または指定した既定値)を返す。
in 演算子:値がシーケンスやコンテナに含まれるかを調べる演算子。辞書ではキーの有無を調べる。
index():指定した値と等しい最初の要素の位置を返すリストのメソッド。探し始めと終わりの位置も指定でき、見つからなければ ValueError。
IndexError:シーケンスの範囲外のインデックスを指定したときに発生する例外。
insert():指定した位置の直前に要素を挿入するメソッド。a.insert(0, x) は先頭に挿入する。
is 演算子:2 つのオブジェクトが同じオブジェクトかどうかを調べる演算子。
items():辞書のキーと値の組を取り出すメソッド。for k, v in d.items() のようにループで使う。
KeyError:辞書に存在しないキーを指定したときに発生する例外。
NameError:定義されていない名前(変数など)を使ったときに発生する例外。
None:値が無いことを表す特別な値。return の無い関数の戻り値になる。
pop():指定した位置の要素を取り除いて返すメソッド。位置を省略すると最後の要素を対象にする。
popleft():collections.deque の先頭(左端)から要素を取り出して返すメソッド。キューで先に入れた要素を取り出すのに使う。
remove():指定した値と等しい最初の要素を削除するメソッド。見つからなければ ValueError。
reverse():リストの要素の並びを、その場で(元のリストを書き換えて)逆順にするメソッド。
reversed():シーケンスを逆順にたどるイテレータを返す組み込み関数。
sort():リストをその場で(元のリストを書き換えて)並べ替えるメソッド。戻り値は None。
sorted():要素を並べ替えた新しいリストを返す組み込み関数。元のデータは変わらない。
SyntaxError:プログラムの解析中に見つかる文法の誤り。誤りを検出した行と位置が表示される。
TypeError:演算や関数に不適切な型の値を渡したときに発生する例外。
ValueError:型は正しいが値が不適切なときに発生する例外。例えば無い値を list.remove() したとき。
zip():複数のイテラブルの要素を順に組にして返す組み込み関数。
イミュータブル:作った後で内容を変更できない性質。数値・文字列・タプルなどがイミュータブル。
キュー:最初に入れた要素を最初に取り出すデータ構造。Python では collections.deque を使う。
シーケンス:インデックスで要素を取り出せる、順序のあるデータ型。文字列・リスト・タプル・range など。
シーケンスアンパック:x, y, z = t のように、シーケンスの要素を複数の変数に分けて代入すること。変数の数と要素数が一致する必要がある。
スタック:最後に入れた要素を最初に取り出すデータ構造。リストの append() と pop() で実現できる。
スライス:[開始:終了] で部分を取り出す操作。開始位置は含み、終了位置は含まない。範囲外を指定してもエラーにならない。
タプル:コンマで区切った値の並びで、変更できない(イミュータブル)シーケンス。要素 1 つのタプルは値の後にコンマを付ける。
べき乗:** 演算子による計算。2 ** 7 は 2 の 7 乗で 128。
ミュータブル:作った後でも内容を変更できる性質。リスト・辞書・集合などがミュータブル。
リスト:角括弧の中に値をコンマで区切って並べたデータ型。インデックスやスライスが使え、内容を変更できる。
リスト内包表記:[式 for 変数 in イテラブル if 条件] の形でリストを簡潔に作る書き方。
引数のアンパック:リストやタプルを * で、辞書を ** で展開して関数に渡すこと。
辞書:キーと値の組を集めたデータ型。キーには文字列や数値など変更できない型を使う。
辞書の内包表記:{キーの式: 値の式 for 変数 in イテラブル} の形で辞書を作る書き方。
辞書式順序:シーケンスを先頭の要素から順に比べる比較方法。片方がもう片方の先頭部分なら短い方が小さい。
集合:重複しない要素を順序なしで集めたデータ型。和・差・積・対称差の演算ができる。空の集合は set() で作る。
集合の内包表記:{式 for 変数 in イテラブル if 条件} の形で集合を作る書き方。リスト内包表記と同じ形を波括弧で囲む。
浅いコピー:入れ物だけを新しく作り、中の要素は元と同じオブジェクトを参照するコピー。リストのスライス a[:] は浅いコピーを返す。
対称差:2 つの集合のどちらか一方だけに含まれる要素の集まり。演算子 ^ で求める。
代入式::= を使って式の中で変数に代入する書き方。
短絡評価:and と or が左から評価し、結果が決まった時点で残りを評価しない動き。戻り値は最後に評価した値になる。
比較の連鎖:a < b == c のように比較演算子をつなげる書き方。a < b and b == c と同じ意味になる。
独学の次に、講座で体系立てて学びたい人へ
この問題集は独学用です。IT の基礎から講師つきで体系立てて学びたい人には、資格や IT の講座がそろうスクールも選択肢になります。
本ページは広告・アフィリエイトプログラムを利用しており、リンク経由でのお申し込み・購入により当サイトに収益が発生することがあります。ただし、ランキング・評価・掲載内容は広告費や報酬の有無に関わらず編集部の独自基準で決定しており、広告主からの指示により内容を変更することはありません。
IT・Webデザイン・資格まで幅広い講座。生成AI/DX講座はリスキリング補助金の対象
まずは無料ではじめられます。リンク先は公式サイトです。
このサービスの解説記事を読む →