Pythonのenumerate関数とforループでリスト要素とインデックスを取得
- 公開日:2018/10/20
- 更新日:2018/10/21
- 投稿者:n bit
Pythonでリストオブジェクトの要素をforループで取得する際、自動的にインデックス番号も付与したいときに便利な組み込み関数『enumerate関数』について解説。enumerate関数を利用することでとてもシンプルなコードでインデックスを取得することができます。
この記事は約 分で読めます。(文字)
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関数を使うと良いでしょう。
Pythonで複数リストの値を同時に取得するzip関数
Pythonで複数のリストオブジェクトがあり、それぞれのデータを同時に取得して扱いたいときに便利な組み込み関数『zip関数』について解説。データとそれに紐付くラベルやインデックスを同時に扱いたい時によく利用します。
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関数は配列データに様々なインデックス番号を割り振りたいときに便利な組み込み関数です。
出力されたインデックス番号に工夫することで様々な連番表現を持った処理を行うことができます。
【フリーランス向けの完全無料Pythonプログラミング講座】
dot blogではこの記事以外にも完全無料でフリーランス向けのPythonプログラミング講座を公開中です。フリーランスとして活躍し稼ぐための強力な武器となりますよ。
Python入門講座【無料のプログラミング学習講座】
最近特に注目度が高くなってきているプログラミング言語Python。転職、フリーランス、独立・起業を検討中、日々の業務が忙しい社会人等は今こそ身に付けておきたいスキルの1つ。初心者向けにやさしいプログラミング学習内容のPython入門講座を無料で公開。