Python 入門! enumerateで要素&インデックスを同時取得!初心者から実務まで完全解説

2025.08.21
カテゴリー:オフショア開発,開発

 

Pythonでリストやタプルなどのデータ構造を扱う際、「要素」と「インデックス番号」を同時に取得したい場面は多々あります。そんなときに便利なのが、Pythonの組み込み関数 enumerate() です。

 

この記事では、Python初心者向けに enumerate() の基本的な使い方から、forループとの組み合わせ方、応用例、注意点までをわかりやすく解説します。Python学習者や業務でPythonを使い始めた方にとって、必ず役立つ内容となっています。

 

Pythonのforループの基本

 

まずは、Pythonのforループの基本をおさらいしましょう。

 

fruits = [‘apple’, ‘banana’, ‘cherry’]

for fruit in fruits:

    print(fruit)

 

このコードでは、リスト fruits の各要素を順番に取り出して表示しています。インデックス番号(0, 1, 2など)を取得したい場合はどうすればよいでしょうか?

 

インデックス番号を取得する方法①:range()とlen()

Python初心者が最初に思いつくのは、range() と len() を使う方法です。

 

fruits = [‘apple’, ‘banana’, ‘cherry’]

for i in range(len(fruits)):

    print(i, fruits[i])

 

この方法でもインデックス番号と要素を取得できます。

 

インデックス番号と要素を同時に取得する方法②:enumerate()

Pythonでよりスマートな方法が enumerate() を使う書き方です。

 

fruits = [‘apple’, ‘banana’, ‘cherry’]

for i, fruit in enumerate(fruits):

    print(i, fruit)

 

このコードでは、enumerate(fruits) によって (インデックス番号, 要素) のタプルが生成され、それを i, fruitに分解してループ処理しています

 

enumerate() の仕組み

 

enumerate() は、イテラブル(繰り返し可能なオブジェクト)を受け取り、インデックス番号と要素のペアを返すイテレータを生成します

 

list(enumerate([‘a’, ‘b’, ‘c’]))

# 出力: [(0, ‘a’), (1, ‘b’), (2, ‘c’)]

 

このように、enumerate() は内部的に [(0, ‘a’), (1, ‘b’), (2, ‘c’)] のようなタプルのリストを作っていると考えると理解しやすいでしょう。

 

start引数でインデックス番号をカスタマイズ

enumerate() には start 引数を指定することで、インデックス番号の開始値を変更できます。

 

fruits = [‘apple’, ‘banana’, ‘cherry’]

for i, fruit in enumerate(fruits, start=1):

    print(i, fruit)

 

このコードでは、インデックス番号が 1 から始まります。ユーザーに表示する際など、0始まりではなく1始まりにしたい場面で便利です。

 

実務で役立つenumerateの活用例

 

ここからは、業務やプロジェクトでの具体的な活用シーンを紹介します。

 

ログ出力に行番号を付ける

log_messages = [

    “Server started”,

    “Database connected”,

    “User logged in”

]

for line_number, message in enumerate(log_messages, start=1):

    print(f”[Line {line_number}] {message}”)

出力:

[Line 1] Server started

[Line 2] Database connected

[Line 3] User logged in

 

デバッグやログ解析でどの行の処理なのかを明確にできます。

 

ユーザー入力の検証

usernames = [“alice”, “”, “charlie”]

for idx, name in enumerate(usernames, start=1):

    if not name:

        print(f”{idx}番目のユーザー名が未入力です”)

出力:

2番目のユーザー名が未入力です

 

ユーザーごとの位置をすぐに特定できるため、エラー修正が楽になります。

 

データベースに行番号を付与して登録

import sqlite3

 

data = [“Tokyo”, “Osaka”, “Nagoya”]

conn = sqlite3.connect(“:memory:”)

cursor = conn.cursor()

cursor.execute(“CREATE TABLE cities (id INTEGER, name TEXT)”)

for city_id, city_name in enumerate(data, start=1):

    cursor.execute(“INSERT INTO cities VALUES (?, ?)”, (city_id, city_name))

conn.commit()

 

自動的に連番IDを付与できるため、プライマリキーの設定が容易です。

 

ファイル読み込み時の行番号管理

with open(“sample.txt”, encoding=”utf-8″) as f:

    for line_number, line in enumerate(f, start=1):

        print(f”{line_number}: {line.strip()}”)

 

エラー発生時にどの行のデータに問題があるか特定できます。

 

ネストしたループでのenumerate

matrix = [

    [1, 2, 3],

    [4, 5, 6],

    [7, 8, 9]

]

for row_index, row in enumerate(matrix, start=1):

    for col_index, value in enumerate(row, start=1):

        print(f”({row_index},{col_index}) = {value}”)

 

2次元リストや入れ子のデータ構造でもenumerateは活躍します

 

よくあるミスと注意点

too many values to unpack エラー

for index, value, extra in enumerate([“a”, “b”, “c”]):

    pass

 

原因

  • enumerate() が返すのは (index, value) の2つだけ
  • 変数を3つで受け取るとエラー

 

TypeError: ‘int’ object is not iterable

for i, v in enumerate(100):

    pass

 

原因

  • enumerate の引数は イテラブル(反復可能)オブジェクト でなければならない
  • 整数などはそのまま渡せない

 

まとめ

Pythonのenumerate()は、単純なループをよりシンプルかつ効率的に書ける便利な関数です特に、インデックスと値の両方が必要な場面では必須レベルと言っても過言ではありません。enumerate() を使えば、Pythonのforループがより簡潔で読みやすくなります。インデックス番号と要素を同時に取得することで、データ処理の幅が広がり、実務でも役立つ場面が多くあります。

 

Python初心者の方は、まずは基本的な使い方をマスターし、少しずつ応用例にもチャレンジしてみましょう。コードの可読性と効率を高めるために、enumerate() はぜひ習得しておきたい関数のひとつです。

より複雑な業務の自動化やシステム開発でお困りのことがありましたら、ぜひお気軽に3inkへご相談ください。