🐍 Python
enumerate(iterable, start=0)
forループでリストの要素を回しながら、同時にインデックス(何番目か)も取り出せるようにする関数です。「要素と位置の両方が欲しい」という場面で、range(len(...))を使うより簡潔で安全に書けます。
構文: enumerate(iterable, start=0)
戻り値: (インデックス, 要素) のペアを順に返すイテレータ
基本の使い方
fruits = ["apple", "banana", "cherry"]
for i, f in enumerate(fruits):
print(i, f)
# 0 apple
# 1 banana
# 2 cherry
startでインデックスの開始番号を変える
人間向けの表示で「1番目、2番目...」のように1から数えたい場合に便利です。
for i, f in enumerate(fruits, start=1):
print(i, f)
# 1 apple
# 2 banana
# 3 cherry
range(len())との比較
enumerateが無い場合、同じことはrange(len(...))で書けますが、要素を取り出すのにfruits[i]という添字アクセスが別途必要になり、書き間違いの元になります。
for i in range(len(fruits)):
print(i, fruits[i])
# 0 apple
# 1 banana
# 2 cherry(結果はenumerateと同じだが、書き方が冗長)
パラメータ
- iterable
- ループ対象のリストなど
- start(省略可)
- インデックスの開始番号。省略時は0
💡 AIコードレビュー観点:range(len(...))が使われていたらenumerateへの書き換えを検討
AIが生成したコードでfor i in range(len(lst)):のあとにlst[i]で要素を取り出している箇所を見かけたら、enumerate(lst)に書き換えられないか検討する価値があります。添字を打ち間違える(lst[i]をlst[i-1]と書いてしまう等)リスクが減り、読みやすさも上がります。ただし「要素は不要でインデックスだけ欲しい」場合はrange(len(lst))のままで問題ありません。
複数のリストを同時に処理したい場合はzipのページを参照してください。