Pythonで繰り返し処理を行う際、よく使われるのがfor
文です。特にリストやタプルなどの要素を順に処理する中で、「インデックス(index)」を一緒に扱いたい場面は多くあります。Pythonではenumerate()
やrange()
など、インデックス付きのループを実現する便利な方法が多数用意されています。本記事では、Pythonのfor
文におけるインデックスの取得方法とその使いどころについて、初心者にもわかりやすく3000文字以上のボリュームで解説します。明日からのPythonプログラミングにすぐに役立つ内容です!
for文の基本とインデックスの必要性
Pythonのfor
文は、リストや辞書、文字列などのイテラブルなオブジェクトを順に処理するのに使われます。例えば、以下のようにリストを繰り返し処理するのが基本的な使い方です。
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
このコードは各要素を順に取り出して表示するだけですが、「何番目の要素か」を知りたい場面ではインデックスも必要になります。
インデックスを使う方法①:range(len())を使う
最も基本的なインデックス取得方法のひとつが、range()
とlen()
を組み合わせる方法です。
fruits = ["apple", "banana", "cherry"]
for i in range(len(fruits)):
print(f"{i}: {fruits[i]}")
ここでは、range(len(fruits))
が[0, 1, 2]
のようにインデックスのリストを生成し、それを使って要素にアクセスしています。直感的でわかりやすい方法ですが、コードが少し長くなりがちです。
インデックスを使う方法②:enumerate()でスマートに書く
Pythonらしい書き方として、enumerate()
の利用が挙げられます。
fruits = ["apple", "banana", "cherry"]
for i, fruit in enumerate(fruits):
print(f"{i}: {fruit}")
enumerate()
は、各要素に対して自動的にインデックス(番号)を付けてくれる関数です。タプルのように (index, value)
の形で要素を返すので、for i, fruit
のように2つの変数で受け取ります。
この方法は読みやすく、Pythonコミュニティでも推奨される書き方です。
enumerate()の応用:開始番号を変更する
enumerate()
には開始インデックスを変更できる引数があります。
for i, fruit in enumerate(fruits, start=1):
print(f"{i}: {fruit}")
このようにstart=1
と指定することで、インデックスが1から始まります。レポート出力など、1始まりの番号が必要なときに便利です。
辞書とインデックス:キーと値の取得
辞書をループ処理する場合は、インデックスは使いませんが、キーと値の両方を取り出す必要があります。
person = {"name": "Alice", "age": 30, "city": "Tokyo"}
for i, (key, value) in enumerate(person.items()):
print(f"{i}: {key} = {value}")
このようにenumerate()
と.items()
を組み合わせることで、辞書の要素に番号を振りながら処理できます。
文字列とインデックスの取得
文字列もイテラブルなオブジェクトなので、同じようにenumerate()
でインデックスを取得できます。
text = "hello"
for i, char in enumerate(text):
print(f"index {i}: {char}")
この方法を使えば、文字ごとの位置を調べる処理にも応用できます。
2次元リストでのインデックス活用
リストの中にリストがある2次元構造では、入れ子のループでインデックスを扱います。
matrix = [[1, 2], [3, 4], [5, 6]]
for i, row in enumerate(matrix):
for j, val in enumerate(row):
print(f"matrix[{i}][{j}] = {val}")
こうした多重ループの場面でも、enumerate()
は強力なツールとなります。
インデックスが必要ないときは使わないのがベスト
逆に、処理にインデックスが不要な場合は、シンプルにfor item in iterable:
の形式で記述する方が、Pythonらしくて読みやすいです。不要なインデックス処理は可読性を下げる原因になります。
インデックスを使う際の注意点
range(len())
はリストの内容が変化しやすい場合、バグを生みやすい- インデックスがずれると正しい値を参照できなくなる
enumerate()
はタプルで値を返すため、展開する変数の数を間違えるとエラーになる
# エラー例(変数が2つ必要なのに1つしか指定していない)
for pair in enumerate(fruits):
print(pair) # OK
print(pair[0], pair[1]) # OK
print(pair[2]) # IndexError
まとめ:enumerate()はPythonicでスマート!
Pythonでfor
文を使ってインデックスを扱いたい場合、range(len())
とenumerate()
という2つの主な方法があります。その中でも、enumerate()
は可読性が高く、Pythonの思想にも合致した推奨される書き方です。開始インデックスを指定できる点も魅力です。
初心者のうちは、まずenumerate()
を使う練習をして、自然にインデックスを扱えるようにしていくと、コードの品質がグッと上がります。ぜひ日々のコードに取り入れてみてください。