【Python 入門】enumerateとforループでPythonの要素とインデックス番号を同時に取得!

【Python 入門】enumerateとforループでPythonの要素とインデックス番号を同時に取得!

この記事では、Python の便利な組み込み関数である enumerate 関数について解説します。enumerate は、日本語では「列挙」という意味です。enumerate 関数を使わなくてもコーディング可能なケースがほとんどですが、使えると非常に便利ですので、ぜひマスターしましょう。

キカガク 認定講師 古賀

2021年キカガク長期コース卒業。2024年GENIAC松尾研LLM開発プロジェクトメンバー。機械学習と生成AIの無限の可能性にワクワクが止まらず、自身もマイペースで勉強中。

基本編

enumerate 関数 は、for ループ文にて、ループの回数 ( インデックス ) を取得するための関数です。この関数を使えば、ループ内でインデックスを簡単に取得できます。

通常の for ループ文

まず、enumerate 関数を使わない通常の for ループ文を見てみましょう。for ループ文で、要素を取得して、表示しています。

Python
islands = ["北海道", "本州", "四国", "九州"]

for value in islands:
    print(value)
実行結果
北海道
本州
四国
九州

enumerate 関数を使った for ループ文

次に、enumerate 関数を使ったfor ループ文を見てみましょう。for ループ文で、インデックスと要素を取得して、表示しています。

Python
islands = ["北海道", "本州", "四国", "九州"]

for index, value in enumerate(islands):
    print(index, value)
実行結果
0 北海道
1 本州
2 四国
3 九州

このように、enumerate 関数を使うと、各要素のインデックスも同時に取得できます。for ループ時にインデックスが必要になるケースはよくあります。そのような場合に、enumerate 関数を使うと、インデックスを簡単に取得できるため非常に便利なのです。

補足:enumerate 関数を使わずにインデックスを取得

ちなみに、覚える必要はありませんが、enumerate 関数を使わない場合、以下のようにインデックスを自前で実装することになります。enumerate 関数を使った方が、コードはシンプルで読みやすいですね。ぜひ活用しましょう。

Python
islands = ["北海道", "本州", "四国", "九州"]

index = 0
for value in islands:
    print(index, value)
    index += 1
実行結果
0 北海道
1 本州
2 四国
3 九州

補足:enumerate 関数を1変数に取り出した場合

enumerate 関数は通常、インデックスと値を 2 つの変数に分けて取り出すことが多いですが、もし 1 つの変数で取り出した場合、tuple ( タプル ) 型で返されます。

Python
islands = ["北海道", "本州", "四国", "九州"]

for value in enumerate(islands):
    print(value)
実行結果
(0, '北海道')
(1, '本州')
(2, '四国')
(3, '九州')

enumerate 関数を適用できるデータ型

先ほどの例では、list ( リスト )型の変数 islands に対して enumerate 関数を適用しましたが、他にも種々のデータ型に対して enumerate 関数を使うことができます。
enumerate 関数を適用できる主なデータ型は、list ( リスト )、tuple ( タプル )、dictionary ( 辞書 )、set ( 集合 )型となります。

それぞれ、実行例を見てみましょう。

tuple ( タプル ) 型。

Python
islands = ("北海道", "本州", "四国", "九州")

for index, value in enumerate(islands):
    print(index, value)
実行結果
0 北海道
1 本州
2 四国
3 九州

dictionary ( 辞書 ) 型。

enumerate 関数は、dictionary 型に対しては、インデックスとキーのみを返します。

Python
islands = {'hk': '北海道', 'hs': '本州', 'sk': '四国', 'ks': '九州'}

for index, key in enumerate(islands):
    print(index, key)
実行結果
0 hk
1 hs
2 sk
3 ks

要素も取り出す場合、dictionary の items() メソッドが便利です。

Python
islands = {'hk': '北海道', 'hs': '本州', 'sk': '四国', 'ks': '九州'}

for index, (key, value) in enumerate(islands.items()):
    print(index, key, value)
実行結果
0 hk 北海道
1 hs 本州
2 sk 四国
3 ks 九州

set ( 集合 )型。set については、集合の各要素にインデックスを付けることができますが、取り出す順序が保証されていません。

Python
islands = {"北海道", "本州", "四国", "九州"}

for index, key in enumerate(islands):
    print(index, key)
実行結果
0 四国
1 本州
2 北海道
3 九州

使用頻度は低いですが、str 型や range 型についても enumerate 関数を適用することが可能です。

まずは str 型の例です。

Python
hokkaido = "北海道"

for index, char in enumerate(hokkaido):
    print(index, char)
実行結果
0 北
1 海
2 道

次に range 型の例です。

Python
for index, number in enumerate(range(5, 10)):
    print(index, number)
実行結果
0 5
1 6
2 7
3 8
4 9

詳細仕様

公式ドキュメント

enumerate 関数の公式ドキュメントを確認してみましょう。

まず、引数が 2 つあることが分かります。2 番目の引数は、インデックスの開始番号です。指定しない場合、インデックスはこれまで見てきた通り 0 から始まります。なお、刻み幅 ( step ) を指定することはできません。

1 番目の引数は、「シーケンスか iterator か、あるいはイテレーションをサポートするその他のオブジェクト」と記載されています。これまでに見てきた、list 型、tuple 型、dictionary 型、set 型、str 型、range 型の変数が該当します。

補足:yield

enumerate 関数の話ではありませんが、公式ドキュメントにはあまり見慣れないものとして、yield というワードがあります。
yield は関数で使われる return との違いで理解しておきましょう。
return は関数の実行を終了し、指定された値を返します。一方で yield は、関数の実行を一時停止し、指定された値を返しつつもその状態を保持しています。
次に呼び出されたときには、前回の続きから実行されます。返すのはジェネレータオブジェクトと呼ばれるもので、ループなどで値を取得できます。

yield を使った簡単なコードを見てみましょう。値を返したときの状態を保持しているため、カウントアップができていますね。

ここではこれ以上踏み込みませんが、詳しくは、ジェネレータの作成に使えるという話になります。

Python
def count_up_to(max_value):
    count = 1
    while count <= max_value:
        yield count
        count += 1

out = list(count_up_to(5))
print(out)
実行結果
[1, 2, 3, 4, 5]

補足:for ループ文を使わずに enumerate 関数を実行

基本編で見たように、一般的には enumerate 関数は for ループ文で使用するものですが、ここでは、for ループ文を使わずに実行してみます。enumerate 関数実行時点では、ジェネレータオブジェクトが返るのみで、yield 自体は一つも実行されません。ここでは、list に変換することで、yield を実行させて、値を取得することができています。

Python
islands = ["北海道", "本州", "四国", "九州"]

obj = enumerate(islands)
all_items = list(obj)
print(all_items)
実行結果
[(0, '北海道'), (1, '本州'), (2, '四国'), (3, '九州')]

まとめ

enumerate 関数は、リスト型などの for ループ文で、インデックスと要素を同時に取得できる便利なツールです。コードの可読性を高め、手動でインデックスを管理する必要がなくなります。ぜひ、日常のコーディングに取り入れてみてください。

また、enumerate 関数は、zip や sorted といった他の関数と組み合わせて使うことで、さらに強力なデータ処理が可能になります。加えて、enumerate 関数はメモリ効率も非常に高く、大量のデータを扱う際にも適した方法です。これらの特徴を活かして、効率的なコードを書いていきましょう。