Pythonの for 文は、リストの要素を直接取り出して処理できるため非常に便利ですが、「現在が何番目の要素なのか(インデックス)」や「何回目のループなのか」という情報が必要になる場面があります。
他の言語経験者がやりがちな range(len(リスト)) を使う方法は、Pythonでは推奨されません。代わりに、組み込み関数の enumerate() を使用するのが、最も効率的で読みやすい方法(Pythonicな書き方)です。
この記事では、enumerate() 関数を使って、ループ処理中にインデックスと要素を同時に取得する方法を解説します。
1. リストでの基本的な使い方
enumerate() 関数は、引数にリストなどのイテラブル(反復可能オブジェクト)を受け取ります。そして、ループのたびに (インデックス, 要素) のペアを返します。
構文:
for インデックス変数, 要素変数 in enumerate(リスト):
# 処理
使用例: ランキングデータのリストを、順位(インデックス)付きで表示するプログラムです。
# 競技のランキングデータ
ranking_list = ["Team-A", "Team-B", "Team-C", "Team-D"]
print("--- 大会結果 ---")
# idx には 0, 1, 2... が、team にはリストの要素が順に入る
for idx, team in enumerate(ranking_list):
# インデックスは0から始まるため、表示用に+1して順位とする
rank = idx + 1
print(f"第{rank}位: {team}")
実行結果:
--- 大会結果 ---
第1位: Team-A
第2位: Team-B
第3位: Team-C
第4位: Team-D
range(len(ranking_list)) を使って ranking_list[i] と書く必要がなくなり、コードがすっきりしました。
インデックスの開始番号を変更する (start 引数)
enumerate() には、第2引数として start を指定できます。これを指定すると、インデックスの開始番号を 0 以外に変更できます。
先ほどの例で rank = idx + 1 と計算していましたが、start=1 を使えばその必要もなくなります。
# start=1 を指定して、1から数え始める
for rank, team in enumerate(ranking_list, start=1):
print(f"第{rank}位: {team}")
実行結果:
第1位: Team-A
第2位: Team-B
第3位: Team-C
第4位: Team-D
2. 辞書 (dict) での使い方
辞書をループ処理する際にも enumerate() は利用できます。特に .items() メソッドと組み合わせることで、「通し番号」「キー」「値」の3つを同時に扱うことができます。
この場合、変数のアンパック(展開)を少し工夫する必要があります。.items() は (キー, 値) のタプルを返すため、enumerate が返す (インデックス, (キー, 値)) という構造に合わせて変数を用意します。
構文:
for インデックス, (キー, 値) in enumerate(辞書.items()):
# 処理
使用例: 商品の価格リストを表示し、それぞれに商品ID(通し番号)を割り振るプログラムです。
# 商品と価格の辞書
product_prices = {
"Mouse": 2500,
"Keyboard": 5000,
"Monitor": 20000
}
print("--- 商品リスト ---")
# idx, (name, price) の形で受け取る
for idx, (name, price) in enumerate(product_prices.items(), start=1001):
print(f"ID: {idx} | 商品名: {name} | 価格: {price}円")
実行結果:
--- 商品リスト ---
ID: 1001 | 商品名: Mouse | 価格: 2500円
ID: 1002 | 商品名: Keyboard | 価格: 5000円
ID: 1003 | 商品名: Monitor | 価格: 20000円
変数の括弧 (name, price) を省略せず記述することで、タプルの中身をきれいにアンパックできます。
まとめ
- ループ処理でインデックス(何番目の要素か)が必要な場合は、
enumerate()関数を使用します。 for i, value in enumerate(list):の形式で、インデックスと要素を同時に取得できます。start引数を指定することで、インデックスの開始番号(初期値)を自由に変更できます。- 辞書の
.items()と組み合わせることで、辞書の要素にも順序番号を付けて処理することが可能です。
