ホーム テクノロジー 開発 非公開: Python enumerate() 関数、例で説明

Python enumerate() 関数、例で説明


このチュートリアルでは、Python でenumerate()関数を使用する方法を説明します。

Python の enumerate() 関数は、反復可能内の項目とそのインデックスにアクセスするための簡潔な構文を提供します。

まず、単純なループを使用して項目とインデックスにアクセスする方法を確認し、次に Python のenumerate()関数の構文の学習に進みます。その過程でサンプルコードも紹介します。

さぁ、始めよう。

Python で for ループを使用して反復する方法

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

Python-列挙-img
Python-列挙-img

以下のコードセルで定義された買い物リストの例を見てみましょう。

 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 つの変数、 indexitemに解凍できます。

 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 リスト内の項目のインデックスを検索する方法を学びます。コーディングを続けてください!

「 Python enumerate() 関数、例で説明」についてわかりやすく解説!絶対に観るべきベスト2動画

【毎日Python】Pythonでインデックスと値をセットで取得する方法|enumerate