Pythonのenumerate関数とforループでリスト要素とインデックスを取得のイメージ画像

Pythonのenumerate関数とforループでリスト要素とインデックスを取得

  • 公開日:2018/10/20
  • 更新日:2018/10/21
  • 投稿者:n bit

Pythonでリストオブジェクトの要素をforループで取得する際、自動的にインデックス番号も付与したいときに便利な組み込み関数『enumerate関数』について解説。enumerate関数を利用することでとてもシンプルなコードでインデックスを取得することができます。

  • Python

この記事は約 分で読めます。(文字)

enumerate関数とは

enumerate関数とはPythonの配列のオブジェクト(list、tuple、dict等)からforループで要素を取得する際、自動的にインデックスを付与することができる組み込み関数です。

range関数を使って同じようなことはできますがenumerate関数を使ってインデックス番号を付与した方がシンプルなコードになります。

forループのみ

forループのみでリストオブジェクトから要素を取得するとインデックス番号はありません。

st_name = ['大川', '城山', '佐々木', '都築', '野本']


for name in st_name:
print('氏名:{0}'.format(name))

出力結果

氏名:大川

氏名:城山
氏名:佐々木
氏名:都築
氏名:野本

range関数によるforループ

そこでrange関数等を利用してインデックス番号を生成しforループで取得する方法が考えられますが下記のコードのように少し直感的ではありません。また後ほど解説するインデックスを等間隔に開いた数値を利用したい場合などはコードが複雑になりがちです。

st_name = ['大川', '城山', '佐々木', '都築', '野本']


for i in range(len(st_name)):
print('No,:{0} 氏名:{1}'.format(i, st_name[i]))

出力結果

No,:0 氏名:大川

No,:1 氏名:城山
No,:2 氏名:佐々木
No,:3 氏名:都築
No,:4 氏名:野本

enumerate関数によるforループ

enumerate関数数を利用することで事前にインデックス番号を生成する必要がないため最終のコードが非常に直感的でシンプルになります。

st_name = ['大川', '城山', '佐々木', '都築', '野本']


for i, name in enumerate(st_name):
print('No,:{0} 氏名:{1}'.format(i, name))

出力結果

No,:0 氏名:大川

No,:1 氏名:城山
No,:2 氏名:佐々木
No,:3 氏名:都築
No,:4 氏名:野本

enumerate関数の使い方

では早速enumerate関数を使ってみましょう。enumerate関数は引数にインデックスとともに取得したい配列のオブジェクトを指定します。

enumerate(配列オブジェクト)

取得するインデックスの開始番号をコントロールしたい場合は第二引数に開始番号となるインデックス番号を指定することで変更できます。

enumerate(配列オブジェクト,  開始番号)

enumerate関数を使って実際にリストオブジェクトをインデックスと同時に取得してみましょう。enumerate関数は配列オブジェクトのデータを連続で呼び出すため基本的にfor文とあわせて利用します。

リストオブジェクトをenumerate関数でインデックス付き取得

値を格納したリストオブジェクトをenumerate関数でインデックス番号と合わせて取得してみます。返された値をprint関数で出力しました。enumerate関数で最も基本的な使い方です。

st_name = ['大川', '城山', '佐々木', '都築', '野本']


for i, name in enumerate(st_name):
print('No,:{0} 氏名:{1}'.format(i, name))

出力結果

No,:0 氏名:大川

No,:1 氏名:城山
No,:2 氏名:佐々木
No,:3 氏名:都築
No,:4 氏名:野本

値と合わせてインデックス番号が取得されているのが確認できます。

前回学習したzip関数では完全な連番になっていないインデックス番号をリストデータと合わせて取得する方法を解説しましたが、今回のように完全な連番のインデックス番号であればenumerate関数を使うと良いでしょう。

enumerate関数で任意の番号から始まるインデックス付き取得

今度はenumerate関数で取得するインデックス番号の開始番号をコントロールします。第二引数に指定したい開始番号を渡すことで出力することができます。

st_name = ['大川', '城山', '佐々木', '都築', '野本']


for i, name in enumerate(st_name, 5):
print('No,:{0} 氏名:{1}'.format(i, name))

出力結果

No,:5 氏名:大川

No,:6 氏名:城山
No,:7 氏名:佐々木
No,:8 氏名:都築
No,:9 氏名:野本

開始番号が引数に指定した数字から始まるインデックス番号に変更されていることが確認できます。

enumerate関数で等間隔に空いた(等差数列)インデックス番号で取得

インデックスで取得したい番号が常に連番とは限りません。例えば等間隔で空いた数値(等差数列)を取得したいような場合もあるでしょう。その場合の対応方法を解説しておきます。

○の倍数

ある数値の倍数で取得したような場合は下記コードのように出力されたインデックス番号に掛け合わせることで表現することができます。

st_name = ['大川', '城山', '佐々木', '都築', '野本']


for i, name in enumerate(st_name, 1):
i = i * 5
print('No,:{0} 氏名:{1}'.format(i, name))

出力結果

No,:5 氏名:大川

No,:10 氏名:城山
No,:15 氏名:佐々木
No,:20 氏名:都築
No,:25 氏名:野本

浮動小数点の連番

連番を浮動小数点で取得したような場合は下記コードのように出力されたインデックス番号を割ることで表現することができます。

st_name = ['大川', '城山', '佐々木', '都築', '野本']


for i, name in enumerate(st_name, 1):
i = i / 10
print('No,:{0} 氏名:{1}'.format(i, name))

出力結果

No,:0.1 氏名:大川

No,:0.2 氏名:城山
No,:0.3 氏名:佐々木
No,:0.4 氏名:都築
No,:0.5 氏名:野本

奇数の連番

連番を偶数で取得したような場合は出力されたインデックス番号に2をかけることで表現できますが、奇数の場合はどうすればよいでしょうか。下記コードのように出力されたインデックス番号に2をかけ–1することで表現することができますね。

st_name = ['大川', '城山', '佐々木', '都築', '野本']


for i, name in enumerate(st_name, 1):
i = i * 2 - 1
print('No,:{0} 氏名:{1}'.format(i, name))

出力結果

No,:1 氏名:大川

No,:3 氏名:城山
No,:5 氏名:佐々木
No,:7 氏名:都築
No,:9 氏名:野本

今日のdot

enumerate関数は配列データに様々なインデックス番号を割り振りたいときに便利な組み込み関数です。

出力されたインデックス番号に工夫することで様々な連番表現を持った処理を行うことができます。