このチュートリアルでは、Python で enumerate() 関数を使用する方法を説明します。
Python の enumerate() 関数は、反復可能内の項目とそのインデックスにアクセスするための簡潔な構文を提供します。
まず、単純なループを使用して項目とインデックスにアクセスする方法を確認し、次に Python の enumerate() 関数の構文の学習に進みます。その過程でサンプルコードも紹介します。
さぁ、始めよう。

Python で for ループを使用して反復する方法
反復処理して個々の項目に一度に 1 つずつアクセスできる Python オブジェクトは、反復可能オブジェクトと呼ばれます。したがって、Python のリスト、タプル、辞書、文字列はすべて反復可能です。

以下のコードセルで定義された買い物リストの例を見てみましょう。
shopping_list = ["fruits","cookies","cereals","protein bars","post-it notes"]
Python では、
for
ループを使用して任意の反復可能オブジェクトをループできます。これを行うための構文は次のとおりです。
for item in <iterable>:
# do something on item
# item: looping variable
# <iterable>: any Python iterable: list, tuple, dictionary, string, and so on.
次に、この構文を使用して、
shopping_list
をループし、個々のアイテムにアクセスしてみましょう。
for item in shopping_list:
print(item)
# Output
fruits
cookies
cereals
protein bars
post-it notes
この構造は、項目に直接アクセスするのに役立ちます。ただし、項目自体に加えて、項目のインデックスにアクセスする必要がある場合もあります。
以下に示すように、ループ本体内でインクリメントできる
index
変数を使用できます。
index = 0
for item in shopping_list:
print(f"index:{index}, {item}")
index += 1
# Output
index:0, fruits
index:1, cookies
index:2, cereals
index:3, protein bars
index:4, post-it notes
しかし、これは最も効率的な方法ではありません。インデックスをインクリメントすることを忘れると、コードは期待どおりに動作しません。
index = 0
for item in shopping_list:
print(f"index:{index}, {item}")
# no update of index inside loop body
# index is never updated and is always 0
# Output
index:0, fruits
index:0, cookies
index:0, cereals
index:0, protein bars
index:0, post-it notes
for
ループを使用するもう 1 つの一般的なパターンは
range()
関数と組み合わせて使用することです。それについては次のセクションで学びます。

range() 関数を使用してインデックスにアクセスする方法
Python の組み込み len() 関数は、Python オブジェクトの長さを返します。したがって、引数に
shopping_list
指定して
len()
関数を呼び出して、
shopping_list
の長さ (この場合は 5) を取得できます。
len(shopping_list)
# Output: 5
range()
関数は、ループで使用できる範囲オブジェクトを返します。
range(stop)
をループすると、インデックス 0、1、2、…、stop-1 が得られます。
stop = len(list)
を設定すると、有効なインデックスのリストを取得できます。したがって、
range()
関数を使用すると、以下に示すように、インデックスと対応する項目にアクセスできます。
for index in range(len(shopping_list)):
print(f"index:{index}, item: {shopping_list[index]}")
# Output
index:0, item: fruits
index:1, item: cookies
index:2, item: cereals
index:3, item: protein bars
index:4, item: post-it notes
ただし、これは、インデックスと項目の両方に同時にアクセスするための Python の推奨方法ではありません。

Python enumerate() 関数の構文
Python の enumerate() 関数を使用すると、次の一般的な構文を使用して項目とそのインデックスにアクセスできます。
enumerate(<iterable>, start = 0)
上記の構文では次のようになります。
-
<iterable>
は 必須 パラメータであり、リストやタプルなどの任意の Python 反復可能パラメータを指定できます。 - start は、カウントを開始するインデックスを制御するオプションのパラメータです。 start の値を指定しない場合、デフォルトは 0 です。
これで、
shopping_list
を使用して
enumerate()
関数を呼び出すことができ、以下のコード セルに示すように、列挙オブジェクトが返されます。
enumerate(shopping_list)
<enumerate at 0x7f91b4240410>
enumerate
オブジェクトをループすることはできません。そこで、
enumerate
オブジェクトを Python リストに変換しましょう。
list(enumerate(shopping_list))
# Output
[(0, 'fruits'),
(1, 'cookies'),
(2, 'cereals'),
(3, 'protein bars'),
(4, 'post-it notes')]
enumerate
オブジェクトの項目にアクセスする別の方法は、
enumerate
オブジェクトを引数として
next() 関数
を呼び出すことです。 Python では、
next()
関数はイテレータから次の項目を返します。
内部的には、
next()
関数はイテレータ オブジェクトの
__next__
メソッドを呼び出して連続する項目を取得することによって機能します。
enumerate オブジェクトを変数
shopping_list_enum
に代入しましょう。
shopping_list_enum = enumerate(shopping_list)
最初に
shopping_list_enum
を指定して
next()
を呼び出すと、インデックス 0 とインデックス 0 の項目、つまりタプル
(0, 'fruits')
が取得されます。
next()
関数の呼び出しをさらに続けると、以下で説明するように、連続する項目とそのインデックスが取得されます。
next(shopping_list_enum)
# (0, 'fruits')
next(shopping_list_enum)
# (1, 'cookies')
next(shopping_list_enum)
# (2, 'cereals')
next(shopping_list_enum)
# (3, 'protein bars')
next(shopping_list_enum)
# (4, 'post-it notes')
すべての項目にアクセスし、リストの最後に到達した後で
next()
関数を呼び出すとどうなりますか?
StopIteration Error
発生します。
next(shopping_list_enum)
# ---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-16-4220f68f6c7e> in <module>()
----> 1 next(shopping_list_enum)
StopIteration:
enumerate()
関数は、必要な場合にのみ連続するインデックスと項目を返し、事前に計算されません。メモリ効率を考慮する必要がある Python プロジェクトでは、大きな反復可能オブジェクトをループする必要があるときに
enumerate()
関数を使用してみることができます。

Python enumerate() 関数の例
enumerate()
関数を使用する構文を学習したので、前に作成した for ループを変更しましょう。
前のセクションから、列挙オブジェクトをループすると、インデックスと項目を含むタプルが返されることがわかりました。このタプルを 2 つの変数、
index
と
item
に解凍できます。
for index, item in enumerate(shopping_list):
print(f"index:{index}, item:{item}")
# Output
index:0, item:fruits
index:1, item:cookies
index:2, item:cereals
index:3, item:protein bars
index:4, item:post-it notes
次に、カスタム開始値を指定する方法を見てみましょう。
カスタム開始値を使用して enumerate() を実行する方法
Python はゼロインデックスに従っているため、デフォルトでは
start
値は 0 です。ただし、人間が判読できる形式でインデックスを 1 から開始する必要がある場合、または任意のその他のインデックスを選択する必要がある場合は、カスタム
start
値を指定できます。
shopping_list
例では、1 からカウントを開始したい場合は、
start = 1
を設定します。
for index, item in enumerate(shopping_list,1):
print(f"index:{index}, item:{item}")
# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes
ただし、カスタム開始値を指定する場合は、必ず 2 番目の 位置引数として指定する必要があります。
反復可能オブジェクトと開始値の順序を誤って入れ替えると、以下のコード セルで説明されているように、エラーが発生します。
for index, item in enumerate(1,shopping_list):
print(f"index:{index}, item:{item}")
# Output
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-5dbf7e2749aa> in <module>()
----> 1 for index, item in enumerate(1,shopping_list):
2 print(f"index:{index}, item:{item}")
TypeError: 'list' object cannot be interpreted as an integer
このようなエラーを回避するには、以下に示すように、キーワード引数として
start
を指定します。
for index, item in enumerate(shopping_list, start = 1):
print(f"index:{index}, item:{item}")
# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes
ここまでは、Python リストで
enumerate()
関数を使用する方法を学習しました。 enumerate 関数を使用して、Python 文字列、辞書、タプルをループすることもできます。
Python タプルで enumerate() 関数を使用する方法
shopping_list
タプルであると仮定します。 Python では、タプルもコレクションであり、Python のリストと似ていますが、
不変
です。したがって、それらを変更することはできず、変更しようとするとエラーが発生します。
次のコード スニペットは、
shopping_list
タプルとして初期化します。
shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
type(shopping_list)
# Tuple
タプルの最初の項目を変更しようとすると、Python タプルは不変のコレクションであるため、エラーが発生します。
shopping_list[0] = 'vegetables'
# Output
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-ffdafa961600> in <module>()
----> 1 shopping_list[0] = 'vegetables'
TypeError: 'tuple' object does not support item assignment
▶ 次に、次のコード スニペットを実行して、
enumerate()
関数がタプルに対して期待どおりに動作することを確認します。
shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
for index, item in enumerate(shopping_list):
print(f"index:{index}, item:{item}")
Python 文字列で enumerate() 関数を使用する方法
Python enumerate() 関数を使用して文字列をループし、文字とインデックスに同時にアクセスすることもできます。
ここに一例を示します。
py_str = 'Butterfly'
for index, char in enumerate(py_str):
print(f"index {index}: {char}")
# Output
index 0: B
index 1: u
index 2: t
index 3: t
index 4: e
index 5: r
index 6: f
index 7: l
index 8: y
上記の出力から、文字とそのインデックス (0 ~ 8) が出力されたことがわかります。
結論👩🏽💻
ここで学んだことをまとめます。
- for ループを使用して項目にアクセスし、別のカウンターまたはインデックス変数を維持できます。
- 必要に応じて、 range() 関数を使用して有効なインデックスを取得し、リストにインデックスを付けることで項目にアクセスできます。
- 推奨される Python の方法として、Python の enumerate() 関数を構文 enumerate(iterable) で使用できます。デフォルトでは、カウントまたはインデックスは 0 から始まります。
- enumerate(iterable, start) 構文を使用してカスタム 開始 値を指定すると、値 start で始まるインデックスと対応する項目を取得できます。
- enumerate 関数は、タプル、文字列、辞書、および一般に任意の Python 反復可能オブジェクトを操作するときに使用できます。
enumerate() 関数に関するこのチュートリアルがお役に立てば幸いです。次に、Python リスト内の項目のインデックスを検索する方法を学びます。コーディングを続けてください!