enumerate()は、シーケンス(リストやタプル、文字列)や辞書などの各要素にインデックスを付与して、新しいイテラブルを生成する関数です。
これを使うと、例えばリストの各要素とインデックスを同時に取得することができ、インデックス用の変数を個別に追加せずに簡単に書くことが出来ます。
本記事では、この関数の使い方について具体例を交えて解説します。
enumerate()の基本
enumerage() は、リストやタプル、文字列などのシーケンス型や辞書型の各要素にインデックスを付けて、新しいイテラブルを生成します。
書式は以下です。
enumerate(iterable, start=0)
- 第一引数iterable:シーケンス(リスト、タプル、文字列)や辞書、その他イテレータオブジェクト
- 第二引数start:インデックスの開始値(デフォルトはstart=0)
簡単な例を以下に記載します。
(返り値はenmumerateオブジェクトとなるのでlist()でリスト化しています。)
>>> l = ["a", "b", "c"]
# インデックスが付与された新しいイテラブル
>>> list(enumerate(l))
[(0, 'a'), (1, 'b'), (2, 'c')]
# 返り値はenumerateオブジェクトです。
>>> enumerate(l)
<enumerate object at 0x7fcee8786960>
コードの簡易化
enumerate()を使う場合/使わない場合のコードを比較します。
enumerate()を使わない場合
この場合は、インデックスを表す変数(★部)を追加に定義します。
>>> l = ["a", "b", "c"]
>>> i = 0 ★インデックスを表す変数
>>> for v in l:
... print(i, v)
... i += 1
...
0 a
1 b
2 c
enumerate()を使った方法
enumerate()を使うと、余計な変数を設定する必要がなく、簡単に書くことが出来ます。
>>> l = ["a", "b", "c"]
>>> for i, v in enumerate(l):
... print(i, v)
...
0 a
1 b
2 c
インデックスの開始を指定
第二引数startを設定すると、インデックスの開始値を任意に指定することが出来ます。
例えば、インデックスを1から開始したいときは、下記のようにstart = 1を指定します。
>>> for i, v in enumerate(l, start=1):
... print(i, v)
...
1 a
2 b
3 c
その他のシーケンス型の例
上記はリストの例でしたが、冒頭でも述べたようにこの関数はシーケンス(リスト、タプル、文字列)、辞書にも適用出来ます。それぞれの例を記載します。
- タプルの例
>>> t = ("a", "b", "c")
>>> for i, v in enumerate(t):
... print(i, v)
...
0 a
1 b
2 c
>>> s = "abc"
>>> for i, v in enumerate(s):
... print(i, v)
...
0 a
1 b
2 c
- Keyとインデックスを同時に取得
>>> d = {'a':9, 'b':8, 'c':7}
>>> for i, v in enumerate(d):
... print(i, v)
...
0 a
1 b
2 c
>>> for i, v in enumerate(d.values()):
... print(i, v)
...
0 9
1 8
2 7
>>> for i, v in enumerate(d.items()):
... print(i, v)
...
0 ('a', 9)
1 ('b', 8)
2 ('c', 7)
確認した環境
- OS: Ubuntu20.04LTS
- Python3.9.1
まとめ
- Pythonの標準組込み関数のenumerate()は、シーケンス(リストやタプル、文字列等)や辞書の要素とインデックスを同時に取得することが出来ます。
- 余分な変数を省く事ができコードを簡略化出来ます。
<参考資料> Python公式リファレンス: 組み込み関数 enumerate