Pythonのenumerate関数の使い方(要素とインデックスを取得する)

Pythonのenumerate関数について解説します。

Pythonのenumerate関数の使い方(要素とインデックスを取得する)

Pythonのenumerate()関数は組み込み関数のひとつで、for文でリストやタプルなどのイテラブルの要素にアクセスする際に、要素とそのインデックスを同時に取り出してくれる関数です。ちなみに、enumerateとは『数え上げる』という意味の英単語です。

この記事ではenumerate()関数の基本的な使い方について解説します。

enumerate関数の基本的な使い方

enumerate()関数は、リストやタプルなどのイテラブルなオブジェクトを引数に取って使用します。通常のfor文と、enumerate()関数を使う場合を比較してみます。

enumerate()関数は、ループごとにインデックスと要素を返すため、for文ではそれらを変数に格納してループ内で使用します。

# 通常のfor文とenumerate関数を使ったfor文の比較

l = ["one", "two", "three"]

# 通常のfor文
for value in l:
    print(value)

# one
# two
# three


# enumerateを使ったfor文
# インデックスをi、要素をvalueで取得
for i, value in enumerate(l):
    print(f"インデックス:{i}、要素:{value}")

# インデックス:0、要素:one
# インデックス:1、要素:two
# インデックス:2、要素:three

enumerate()関数を使わずにfor文の中でインデックスを利用したい場合には、i = 0からスタートしてループごとにインクリメントする方法もありますが、enumerate()関数を使えば、リストやタプルを囲むだけでインデックスを取得できます。前者の手法と比較して、より複雑な処理になった際にインクリメントの処理を間違ってしまうことも防ぐことができます。

上記の例ではインデックスと要素を分けて変数に格納しましたが、割り当てる変数を一つだけにすると、インデックスと要素がまとめられたタプルを返すようになります。

# 展開する変数を一つにするとタプルを返す

l = ["one", "two", "three"]

for t in enumerate(l):
    print(t)

# (0, 'one')
# (1, 'two')
# (2, 'three')

辞書型や文字列型にenumerate関数を使う

各要素を取り出すだけなので、リストやタプルにenumerate()関数を使うことができるのはイメージしやすいと思いますが、辞書型dictや文字列型strにも同様に使用することができます。

辞書型で要素として取り出されるのは、キーの方であることに注意してください

# 辞書型や文字列型にenumerate関数を使う

# 辞書型
d = {"name": "太郎", "age": 20, "occupation": "プログラマ"}
for i, k in enumerate(d):
    print(f"インデックス:{i}、キー:{k}、値:{d[k]}")

# インデックス:0、キー:name、値:太郎
# インデックス:1、キー:age、値:20
# インデックス:2、キー:occupation、値:プログラマ


# 文字列型
string = "私の名前は太郎です"
for i, v in enumerate(string):
    print(f"インデックス:{i}、値:{v}")

# インデックス:0、値:私
# インデックス:1、値:の
# インデックス:2、値:名
# インデックス:3、値:前
# インデックス:4、値:は
# インデックス:5、値:太
# インデックス:6、値:郎
# インデックス:7、値:で
# インデックス:8、値:す

enumerate関数のインデックス開始位置を変更する

enumerate()関数のインデックスは0からスタートしますが、第二引数に値を指定することで、0以外の任意の数からインデックスをスタートすることができます。見やすいような連番をつけるために、インデックスを1からスタートしたい場合などに利用できます。

# enumerate関数のインデックス開始位置を指定する

l = ["one", "two", "three"]

# インデックスを100からスタートさせる
for i, value in enumerate(l, 100):
    print(f"インデックス:{i}、要素:{value}")

# インデックス:100、要素:one
# インデックス:101、要素:two
# インデックス:102、要素:three

enumerate関数の要素を逆順に取得する(reversed)

reversed()関数と組み合わせることで、要素を逆順に取得することができます。インデックスは逆順になっていないことに注意してください

# 要素を逆順に取得する

l = ["one", "two", "three"]

for i, value in enumerate(reversed(l)):
    print(f"インデックス:{i}、要素:{value}")

# インデックス:0、要素:three
# インデックス:1、要素:two
# インデックス:2、要素:one

enumerate関数のインデックスの増分を変更する

Pythonのrange()関数などではstepを指定することで、インデックスの増分(一つ進むごとにいくつ増えるか)を変更することができます。enumerate()関数には同様の指定はできないため、for文などの外部でstepを指定して対応します。

# enumerate関数のインデックスの増分を変更する

l = ["one", "two", "three"]
step = 2

# インデックスを2ずつ増加させる
for i, value in enumerate(l):
    print(f"インデックス:{i*step}、要素:{value}")

# インデックス:0、要素:one
# インデックス:2、要素:two
# インデックス:4、要素:three