当サイトは、アフィリエイト広告を利用しています

【Python】enumerateの使い方|実務で使う場面とREST API例

作成日:2026月02月18日
更新日:2026年02月18日

Pythonでループ処理を書くとき、基本は for 文を使うことが多い。
ただし「要素」と同時に「何番目か(インデックス)」も扱いたい場面では、enumerate() を使うほうが意図が明確で読みやすい。

本記事では

  • enumerate関数とは何か?
  • enumerate関数の使い方
  • 実務での使用例

を整理する

enumerate関数とは何か?

enumerate関数はイテラブル(list・tuple・set など)を
走査しながらインデックスを同時に取得するための組み込み関数である。

構文としては下記のようになる

enumerate関数構文
enumerate(iterable, start=0)
  • iterable:イテラブルオブジェクト
  • start:開始インデックス(省略可)

enumerate() はイテレータ(enumerateオブジェクト)を返す。
そのため、必要になるまで値を生成しない(遅延評価)。

また、インデックス管理と値の取得を同時に記述できるため、
range(len(...)) と比べて意図が明確になりやすい。

性能向上というよりも、可読性と安全性を高めるために使うのが主目的である。

通常のforループは値しか取得できない。 しかし、enumerate() を使うと

  • 何番目か(index)
  • 要素そのもの(value)

を同時に取得できる。

enumerate関数の使い方

具体的なenumerate関数の使い方

  • enumerate関数の基本の使い方
  • enumerate関数を使ったfor文
  • enumerate関数を使ったwhile文
  • enumerate関数を使ったリスト内包表記
  • enumerate関数を使った辞書内包表記
  • enumerate関数を使った集合内包表記

のサンプルの載せる

enumerate関数の使い方

enumerate関数の使い方
lst = ["A", "B", "C"]
e = enumerate(lst)
print(list(e))
# [(0, 'A'), (1, 'B'), (2, 'C')]
print(list(e))
# [] ← イテレータなので一度消費すると空になる

enumerate 自体はイテレータであり、list化すると内容が確認できる。

enumerate関数を使ったfor文

enumerate関数を使ったfor文
lst = ["A", "B", "C"]
for index, value in enumerate(lst):
print(index, value)
# 0 A
# 1 B
# 2 C
  • enumerate は「値とインデックスを同時に扱う」という意図を明確に表現できる。

enumerate関数を使ったwhile文

enumerate関数を使ったwhile文
lst = ["A", "B", "C"]
it = enumerate(lst)
while True:
try:
index, value = next(it)
print(index, value)
except StopIteration:
break
  • enumerate はイテレータなので、next()を使えばwhileでも扱える。
  • whileで使うのは「明示的にイテレータ制御したい場合」に限られる。

enumerate関数を使ったリスト内包表記

enumerate関数を使ったリスト内包表記
lst = ["A", "B", "C"]
print([index for index, value in enumerate(lst)])
# [0, 1, 2]
print([value for index, value in enumerate(lst)])
# ['A', 'B', 'C']
  • リスト内包表記と併用することも可能

enumerate関数を使った辞書内包表記

enumerate関数を使った辞書内包表記
lst = ["A", "B", "C"]
print({index: value for index, value in enumerate(lst)})
# {0: 'A', 1: 'B', 2: 'C'}
  • 辞書内包表記と併用することも可能

enumerate関数を使った集合内包表記

enumerate関数を使った集合内包表記
lst = ["A", "B", "C"]
print({value for index, value in enumerate(lst)})
# {'A', 'B', 'C'}
  • setは順序を保持しないため、enumerateで付くindexは実用上あまり意味を持たないことが多い

実務での使用例

実際に実装のどこで使われるかを確認する。

APIレスポンスの整形(配列→表示用にindex付与)

APIレスポンスの整形(配列→表示用にindex付与)
users = [
{"id": "u1", "name": "mori"},
{"id": "u2", "name": "shimada"},
]
# 表示用に連番(no)を付与(1始まり)
view_models = [
{"no": i, **user}
for i, user in enumerate(users, start=1)
]
# [{'no': 1, 'id': 'u1', 'name': 'mori'}, {'no': 2, 'id': 'u2', 'name': 'shimada'}]
  • 辞書内包表記 + アンパック(**) を組み合わせた書き方
  • **user は辞書を展開してマージしている
  • noキーを追加して view 用モデルを作っている
  • start=1 はUIの表示都合 -「何番目の要素か」をUIに出す用途。

バリデーションエラーに行番号を付与(入力配列のどこで落ちたか)

バリデーションエラーに行番号を付与(入力配列のどこで落ちたか)
from pydantic import BaseModel, ValidationError, Field
class UserIn(BaseModel):
user_id: int
name: str
age: int = Field(ge=0) # 0以上
payload = [
{"user_id": 1, "name": "mori", "age": 20},
{"user_id": "x", "name": "shimada", "age": 50},
{"user_id": 3, "name": "kyogoku", "age": -1},
]
errors = []
valid = []
for row, data in enumerate(payload, start=1):
try:
valid.append(UserIn.model_validate(data))
except ValidationError as e:
errors.append({"row": row, "errors": e.errors()})
  • errors の各要素に row が入るので「何行目が壊れてるか」が一発で分かる

まとめ

  • enumerate() は、イテラブルを走査しながらインデックスも同時に扱うための組み込み関数。
  • range(len(...)) より意図が明確になりやすく、実務では「行番号付きのエラー返却」や「表示用の連番付与」などで頻繁に使う。

インデックスが必要なループでは、まず enumerate() を選択肢に入れるとよい。

関連記事

新着記事

タグ一覧
top