AI資格ドリル
資格を選ぶ↓

用語比較

zip() と enumerate() の違い(2つのリストを同時に回すか、番号つきで回すか)

enumerate() は、1つのシーケンスから、カウントと要素のペアを取り出します。zip() は、2つ以上のシーケンスから、各要素をひと組みにして取り出します。どちらも代表的には for 文で2つの変数に受ける形で使います。

Python3基礎試験では、for 文の変数に何が入るかを読み分けます。番号と要素なら enumerate()、別々のリストの要素の組なら zip()と覚えると、選択肢を整理できます。

このページは、Python公式のチュートリアル5.6と組み込み関数の説明をもとに、渡すもの・取り出すもの・長さが違うとき・引数で比べます。例は、説明用の架空のコードです。

この記事の根拠と出典

各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。Python3エンジニア認定基礎試験の一次情報確認日: 2026-09-18。

結論

enumerate()

1つのイテラブルから、カウント(既定は0から)と要素を含むタプルを取り出す。

zip()

複数のイテラブルを並行に処理し、各イテラブルのi番目の要素からなるタプルを取り出す。

見分け方

渡すイテラブルが1つで番号が付くなら enumerate()、複数なら zip()。

違いを表で確認

比較軸enumerate()zip()
渡すものenumerate():1つのイテラブルzip():複数のイテラブル
取り出すものenumerate():カウントと要素を含むタプルzip():各イテラブルのi番目の要素からなるタプル
長さが違うときenumerate():渡すイテラブルは1つなので、長さの食い違いは起きないzip():既定では最も短いイテラブルが尽きると止まり、長いほうの残りは無視する
主な引数enumerate():start でカウントの開始値を決める(既定は0)zip():strict=True で、長さが違うと ValueError になる(3.10で追加)
for文での受け方enumerate():for i, v in enumerate(seq):zip():for q, a in zip(questions, answers):

Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)

試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。

PR

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

2つのリストを同時に回したい人

公式チュートリアルは、2つ以上のシーケンスを同時にループするために zip() を使って各要素をひと組みにできると述べます。zip() だけでは番号は付かないので、番号も要るときは enumerate() と組み合わせます。

02

要素と番号を一緒に取り出したい人

公式チュートリアルは、シーケンスにわたるループで enumerate() を使うと、要素のインデックスと要素を同時に取り出せると述べます。番号を1から始めたいときは start=1 を渡します。

03

長さの違うリストを zip() に渡す人

既定では、最も短いイテラブルの長さに切り詰められ、長いほうの残りは無視されます。長さが同じはずなら、strict=True を使うと食い違いを ValueError で知れます。

具体例で使い分ける

例 1

2つのリストを zip() で回す場合(架空のコード)

names = ["a", "b", "c"] と scores = [10, 20, 30] に対して、list(zip(names, scores)) を表示します。

  • zip() は、各リストのi番目の要素をひと組みにしたタプルを作ります。
  • 最初の組は ("a", 10)、次は ("b", 20)、最後は ("c", 30) です。

結論: [("a", 10), ("b", 20), ("c", 30)] になります。

例 2

start を指定した enumerate() の場合(公式の例)

seasons = ['Spring', 'Summer', 'Fall', 'Winter'] に対して、list(enumerate(seasons, start=1)) を表示します。

  • enumerate() は、カウントと要素のタプルを作ります。
  • start=1 なので、カウントは1から始まります。

結論: [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')] になります。

例 3

長さが違う2つを zip() に渡す場合(公式の例)

list(zip(range(3), ['fee', 'fi', 'fo', 'fum'])) を表示します。

  • range(3) は3要素で、もう一方は4要素です。
  • 最も短いイテラブルが尽きた時点で止まり、'fum' は無視されます。

結論: [(0, 'fee'), (1, 'fi'), (2, 'fo')] になります。strict=True を付けると ValueError になります。

問題文から答えを選ぶ手順

  1. 1

    渡すイテラブルの数を見る

    1つなら enumerate()、複数なら zip() を疑います。

  2. 2

    for文の変数を見る

    番号と要素を受けているなら enumerate()、別々のリストの要素を受けているなら zip() です。

  3. 3

    長さが違わないかを見る

    zip() に渡すリストの長さが違うと、短いほうに合わせて止まります。

  4. 4

    引数を見る

    start は enumerate()、strict は zip() の引数です。

試験での見分け方

  • 1enumerate() は、カウントと要素を含むタプルを返す。カウントは既定で0から始まる。
  • 2zip() は、各イテラブルのi番目の要素を含むタプルのイテレータを返す。
  • 3zip() は既定で、最も短いイテラブルの長さに切り詰める。
  • 4zip() の strict=True は、長さが違うと ValueError を送出する。
  • 5短いイテラブルを一定の値で埋めたいときは、itertools.zip_longest() を使う。

誤答しやすい選択肢

zip() の結果に番号が付くと考える

修正: zip() が返すのは各イテラブルの要素の組です。番号が要るなら enumerate() を使います。

長さが違っても、長いほうの残りも取り出されると考える

修正: 既定では最も短いイテラブルで止まり、残りは無視されます。

enumerate() の番号が必ず1から始まると考える

修正: 既定は0からです。1から始めるには start=1 を渡します。

確認問題

Q1list(enumerate(['x', 'y'])) の結果は?

答え: [(0, 'x'), (1, 'y')]

カウントは既定で0から始まります。

Q2list(zip([1, 2, 3], ['a', 'b'])) の要素数は?

答え: 2

最も短いイテラブルの長さに切り詰められます。

Q3zip() で、長さが違うときに ValueError を送出させる引数は?

答え: strict=True

3.10で追加された引数です。

到達チェック

  • enumerate() と zip() が取り出すものの違いを言える
  • zip() の長さが違うときの動きを言える
  • start と strict がどちらの引数か言える

同じ資格で次に知りたいこと

よくある質問

Qzip() と enumerate() の違いは?

A

enumerate() は1つのイテラブルにカウントを付け、zip() は複数のイテラブルの要素をひと組みにします。

Qzip() で長さが違うとどうなりますか?

A

既定では最も短いイテラブルの長さに切り詰められます。strict=True なら ValueError になります。

Qenumerate() を1から始めるには?

A

start=1 を渡します。既定は0です。

次に見る比較

執筆: ミナト編集部(運営者情報を見る)