当サイトは、アフィリエイト広告を利用しています
Pythonでループ処理を書くとき、基本は for 文を使うことが多い。
ただし「要素」と同時に「何番目か(インデックス)」も扱いたい場面では、enumerate() を使うほうが意図が明確で読みやすい。
本記事では
を整理する
enumerate関数はイテラブル(list・tuple・set など)を
走査しながらインデックスを同時に取得するための組み込み関数である。
構文としては下記のようになる
enumerate(iterable, start=0)
enumerate() はイテレータ(enumerateオブジェクト)を返す。
そのため、必要になるまで値を生成しない(遅延評価)。
また、インデックス管理と値の取得を同時に記述できるため、
range(len(...)) と比べて意図が明確になりやすい。
性能向上というよりも、可読性と安全性を高めるために使うのが主目的である。
通常のforループは値しか取得できない。 しかし、enumerate() を使うと
を同時に取得できる。
具体的なenumerate関数の使い方
のサンプルの載せる
lst = ["A", "B", "C"]e = enumerate(lst)print(list(e))# [(0, 'A'), (1, 'B'), (2, 'C')]print(list(e))# [] ← イテレータなので一度消費すると空になる
enumerate 自体はイテレータであり、list化すると内容が確認できる。
lst = ["A", "B", "C"]for index, value in enumerate(lst):print(index, value)# 0 A# 1 B# 2 C
lst = ["A", "B", "C"]it = enumerate(lst)while True:try:index, value = next(it)print(index, value)except StopIteration:break
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']
lst = ["A", "B", "C"]print({index: value for index, value in enumerate(lst)})# {0: 'A', 1: 'B', 2: 'C'}
lst = ["A", "B", "C"]print({value for index, value in enumerate(lst)})# {'A', 'B', 'C'}
実際に実装のどこで使われるかを確認する。
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'}]
from pydantic import BaseModel, ValidationError, Fieldclass UserIn(BaseModel):user_id: intname: strage: 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()})
enumerate() は、イテラブルを走査しながらインデックスも同時に扱うための組み込み関数。 range(len(...)) より意図が明確になりやすく、実務では「行番号付きのエラー返却」や「表示用の連番付与」などで頻繁に使う。 インデックスが必要なループでは、まず enumerate() を選択肢に入れるとよい。