【Python】enumerateで要素とインデックスを同時に取得

Python 組込み関数

enumerate()は、シーケンス(リストやタプル、文字列)や辞書などの各要素にインデックスを付与して、新しいイテラブルを生成する関数です。
これを使うと、例えばリストの各要素とインデックスを同時に取得することができ、且つ普通にforループを使うよりも簡単に書くことが出来ます。
本記事では、この関数の使い方の基本について具体例を交えて解説します。
#2020/4/6 記事更新

確認した環境

  • OS: Ubuntu18.04LTS
  • Python3.7.4

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>

forループでインデックスと要素を同時に取得する

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
    • Valueとインデックスを同時に取得
    • >>> for i, v in enumerate(d.values()):
      ...     print(i, v)
      ... 
      0 9
      1 8
      2 7
    • (Key, Value)ペアとインデックスを同時に取得
    • >>> for i, v in enumerate(d.items()):
      ...     print(i, v)
      ... 
      0 ('a', 9)
      1 ('b', 8)
      2 ('c', 7)

まとめ

  • Pythonの標準組込み関数のenumerate()は、シーケンス(リストやタプル、文字列等)や辞書の要素とインデックスを同時に取得することが出来ます。
  • 通常のforループと比較して、余分な変数を省く事ができコードを簡略化出来ます。

<参考資料> Python公式リファレンス: 組み込み関数 enumerate

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project