Pythonで繰り返し処理をする際に、要素とインデックスの両方が必要になることがあります。そんな時に便利なのが`enumerate()`関数です。この記事では、`enumerate()`の基本的な使い方から実践的な例まで詳しく解説します。

enumerate()関数の基本

`enumerate()`は、イテラブル(リストや文字列など)の要素に対して、インデックス番号と要素を同時に取得できる関数です。

fruits = ['apple', 'banana', 'orange']
for i, fruit in enumerate(fruits):
    print(f'インデックス {i}: {fruit}')

# 出力:
# インデックス 0: apple
# インデックス 1: banana
# インデックス 2: orange

開始インデックスの指定

デフォルトでは0から始まるインデックスを、任意の数値から開始することができます。

fruits = ['apple', 'banana', 'orange']
for i, fruit in enumerate(fruits, start=1):
    print(f'{i}番目: {fruit}')

# 出力:
# 1番目: apple
# 2番目: banana
# 3番目: orange

実践的な使用例

リスト内の要素の位置を検索

numbers = [10, 20, 30, 40, 50]
target = 30

for i, num in enumerate(numbers):
    if num == target:
        print(f'値{target}は{i}番目にあります')
        break

# 出力: 値30は2番目にあります

複数行のテキスト処理

text = """1行目
2行目
3行目"""

for line_num, line in enumerate(text.split('\n'), 1):
    print(f'行{line_num}: {line}')

# 出力:
# 行1: 1行目
# 行2: 2行目
# 行3: 3行目

辞書の作成

fruits = ['apple', 'banana', 'orange']
fruits_dict = {i: fruit for i, fruit in enumerate(fruits)}
print(fruits_dict)

# 出力: {0: 'apple', 1: 'banana', 2: 'orange'}

注意点とベストプラクティス

1. メモリ効率

`enumerate()`はイテレータを返すため、大きなデータセットでも効率的に処理できます。

2. タプルのアンパック

`enumerate()`から返される要素は、インデックスと値のタプルです。アンパックを使用することで、コードを読みやすくできます。

# 良い例
for i, value in enumerate(items):
    print(i, value)

# 避けるべき例
for item in enumerate(items):
    print(item[0], item[1])

3. 型ヒントの使用

型ヒントを使用することで、コードの可読性と保守性が向上します。

from typing import List

def process_items(items: List[str]) -> None:
    for i, item in enumerate(items):
        print(f'Item {i}: {item}')

まとめ

`enumerate()`関数は、Pythonでインデックス付きループを実現する強力なツールです。以下の特徴があります:

  • インデックスと要素を同時に取得可能
  • 開始インデックスを指定可能
  • メモリ効率が良い
  • コードの可読性を向上

これらの特徴を活かして、効率的なコードを書くことができます。