この記事では、Python の便利な組み込み関数である enumerate 関数について解説します。enumerate は、日本語では「列挙」という意味です。enumerate 関数を使わなくてもコーディング可能なケースがほとんどですが、使えると非常に便利ですので、ぜひマスターしましょう。
キカガク 認定講師 古賀
ゼロから始めるプログラミング
スモールステップで Python を基礎から学べる、初学者の方向けの講座です。演習問題を通して Python の使い方を理解し、データ分析や機械学習実装のための基礎を身につけることを目指します。
DX を推進する AI ・データサイエンス人材育成コース
プログラミング未経験から、AI やデータサイエンスを学ぶことのできる 6 ヶ月間のコースです。転職実績も豊富で、自走できる AI人材を多く輩出しています。
基本編
enumerate 関数 は、for ループ文にて、ループの回数 ( インデックス ) を取得するための関数です。この関数を使えば、ループ内でインデックスを簡単に取得できます。
通常の for ループ文
まず、enumerate 関数を使わない通常の for ループ文を見てみましょう。for ループ文で、要素を取得して、表示しています。
islands = ["北海道", "本州", "四国", "九州"]
for value in islands:
print(value)
北海道
本州
四国
九州
enumerate 関数を使った for ループ文
次に、enumerate 関数を使ったfor ループ文を見てみましょう。for ループ文で、インデックスと要素を取得して、表示しています。
islands = ["北海道", "本州", "四国", "九州"]
for index, value in enumerate(islands):
print(index, value)
0 北海道
1 本州
2 四国
3 九州
このように、enumerate 関数を使うと、各要素のインデックスも同時に取得できます。for ループ時にインデックスが必要になるケースはよくあります。そのような場合に、enumerate 関数を使うと、インデックスを簡単に取得できるため非常に便利なのです。
補足:enumerate 関数を使わずにインデックスを取得
ちなみに、覚える必要はありませんが、enumerate 関数を使わない場合、以下のようにインデックスを自前で実装することになります。enumerate 関数を使った方が、コードはシンプルで読みやすいですね。ぜひ活用しましょう。
islands = ["北海道", "本州", "四国", "九州"]
index = 0
for value in islands:
print(index, value)
index += 1
0 北海道
1 本州
2 四国
3 九州
補足:enumerate 関数を1変数に取り出した場合
enumerate 関数は通常、インデックスと値を 2 つの変数に分けて取り出すことが多いですが、もし 1 つの変数で取り出した場合、tuple ( タプル ) 型で返されます。
islands = ["北海道", "本州", "四国", "九州"]
for value in enumerate(islands):
print(value)
(0, '北海道')
(1, '本州')
(2, '四国')
(3, '九州')
enumerate 関数を適用できるデータ型
先ほどの例では、list ( リスト )型の変数 islands に対して enumerate 関数を適用しましたが、他にも種々のデータ型に対して enumerate 関数を使うことができます。
enumerate 関数を適用できる主なデータ型は、list ( リスト )、tuple ( タプル )、dictionary ( 辞書 )、set ( 集合 )型となります。
それぞれ、実行例を見てみましょう。
tuple ( タプル ) 型。
islands = ("北海道", "本州", "四国", "九州")
for index, value in enumerate(islands):
print(index, value)
0 北海道
1 本州
2 四国
3 九州
dictionary ( 辞書 ) 型。
enumerate 関数は、dictionary 型に対しては、インデックスとキーのみを返します。
islands = {'hk': '北海道', 'hs': '本州', 'sk': '四国', 'ks': '九州'}
for index, key in enumerate(islands):
print(index, key)
0 hk
1 hs
2 sk
3 ks
要素も取り出す場合、dictionary の items() メソッドが便利です。
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 については、集合の各要素にインデックスを付けることができますが、取り出す順序が保証されていません。
islands = {"北海道", "本州", "四国", "九州"}
for index, key in enumerate(islands):
print(index, key)
0 四国
1 本州
2 北海道
3 九州
使用頻度は低いですが、str 型や range 型についても enumerate 関数を適用することが可能です。
まずは str 型の例です。
hokkaido = "北海道"
for index, char in enumerate(hokkaido):
print(index, char)
0 北
1 海
2 道
次に range 型の例です。
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 を使った簡単なコードを見てみましょう。値を返したときの状態を保持しているため、カウントアップができていますね。
ここではこれ以上踏み込みませんが、詳しくは、ジェネレータの作成に使えるという話になります。
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 を実行させて、値を取得することができています。
islands = ["北海道", "本州", "四国", "九州"]
obj = enumerate(islands)
all_items = list(obj)
print(all_items)
[(0, '北海道'), (1, '本州'), (2, '四国'), (3, '九州')]
まとめ
enumerate 関数は、リスト型などの for ループ文で、インデックスと要素を同時に取得できる便利なツールです。コードの可読性を高め、手動でインデックスを管理する必要がなくなります。ぜひ、日常のコーディングに取り入れてみてください。
また、enumerate 関数は、zip や sorted といった他の関数と組み合わせて使うことで、さらに強力なデータ処理が可能になります。加えて、enumerate 関数はメモリ効率も非常に高く、大量のデータを扱う際にも適した方法です。これらの特徴を活かして、効率的なコードを書いていきましょう。
ゼロから始めるプログラミング
スモールステップで Python を基礎から学べる、初学者の方向けの講座です。演習問題を通して Python の使い方を理解し、データ分析や機械学習実装のための基礎を身につけることを目指します。
DX を推進する AI ・データサイエンス人材育成コース
プログラミング未経験から、AI やデータサイエンスを学ぶことのできる 6 ヶ月間のコースです。転職実績も豊富で、自走できる AI人材を多く輩出しています。