Pythonリストでアイテムのインデックスを見つける方法

公開: 2022-06-29

このガイドでは、単純な反復と組み込みのリストメソッドindex()の両方を使用して、Pythonリスト内の要素のインデックスを見つける方法を学習します。

Pythonリストを操作する場合、特定のアイテムが発生するインデックスを見つける必要がある場合があります。 これは次の方法で実行できます。

  • リストをループして、現在のインデックスのアイテムが特定の値と等しいかどうかを確認します
  • 組み込みのリストメソッドindex()を使用する

このチュートリアルでは、上記の両方を学習します。 始めましょう。

Pythonリスト、再考

Pythonでは、リストは同じまたは異なるデータ型のアイテムのコレクションです。 それらは変更可能です; 新しいリストを作成しなくても、その場で変更できます。

このfruitsの例を考えてみましょう:5つの異なる果物のリスト。

 fruits = ["apple","mango","strawberry","pomegranate","melon"]

組み込みのlen()関数を使用して、Pythonオブジェクトの長さを取得できます。 したがって、以下に示すように、リストオブジェクト( fruits )を引数としてlen()関数を呼び出して、その長さを取得できます。

 len(fruits) # Output: 5

このチュートリアルでは、実行例としてfruitsリストを使用します。

Pythonリストでのインデックス作成

Pythonはゼロインデックスに従います。 したがって、Pythonイテレータでは、最初の項目はインデックス0にあり、2番目の項目はインデックス1にあります。 イテレータの長さがkの場合、最後の項目はインデックスk - 1にあります。

Pythonでは、範囲()関数を使用して、反復可能オブジェクトをループするときにインデックスを取得できます。

range(k)をループすると、インデックス0,1,2、…、(k-1)が得られます。 したがって、 k = len(list)を設定することにより、すべての有効なインデックスのリストを取得できます。

次のコードセルはこれを説明しています。

 for i in range(len(fruits)): print(f"i:{i}, fruit[{i}] is {fruits[i]}") # Output i:0, fruit[0] is apple i:1, fruit[1] is mango i:2, fruit[2] is strawberry i:3, fruit[3] is pomegranate i:4, fruit[4] is melon

Pythonリストの基本について説明したので、リスト内のアイテムのインデックスを見つける方法を学びましょう。

python-find-in-list

forループを使用した反復によるリストアイテムのインデックスの検索

前のセクションのfruitsのリストを考えてみましょう。 forループを使用して反復処理することにより、このリスト内の特定のアイテムのインデックスを見つける方法を学習します。

forループとrange()関数の使用

targetを修正しましょう:リストで検索している値。

forループとrange()関数を使用して、 0からlen(fruits) - 1 -1までのインデックスのリストを取得できます。

  • 各インデックスにアクセスする果物のリストをループします。
  • 現在のインデックスiのアイテムがターゲットと等しいかどうかを確認します。
  • Trueの場合、 targetがインデックスiで見つかったことを出力します。
 fruits = ["apple","mango","strawberry","pomegranate","melon"] target = "mango" for i in range(len(fruits)): if fruits[i] == target: print(f"{target} found at index {i}") # Output mango found at index 1

この例では、ターゲット文字列'mango'fruitsリストに1回だけ(インデックス1で)表示されます。

ただし、目標値が複数回表示されたり、まったく表示されなかったりする場合があります。 これらのケースを処理するために、上記のループを変更して、 find_in_listという関数内にコンテンツをラップしてみましょう。

関数定義を理解する

関数find_in_listには、次の2つのパラメーターがあります。

  • target :検索している値、および
  • py_list :検索しているPythonリスト。
 def find_in_list(target,py_list): target_indices = [] for i in range(len(fruits)): if fruits[i] == target: target_indices.append(i) if target_indices == []: print("Sorry, target not found!") else: print(f"{target} is found at indices {target_indices}")

関数本体で、空のリストtarget_indicesを初期化します。 リストをループして、リストアイテムにアクセスします。 ターゲットが特定のインデックスで見つかった場合は、 append()メソッドを使用してそのインデックスをtarget_indicesリストに追加します。

:Pythonでは、 list.append(item)listの最後にitemを追加します。

  • ターゲットが見つからない場合、 target_indicesは空のリストです。 ターゲットがリストに存在しないことがユーザーに通知されます。
  • ターゲットが複数のインデックスで見つかった場合、 target_indicesにはそれらすべてのインデックスが含まれます。

次に、示されているようにfruitsリストを再定義しましょう。

今回は、インデックス1と4で2回発生するtarget文字列'mango'を検索しています。

 fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] target = "mango" find_in_list(target,fruits) # Output mango is found at indices [1, 4]

targetfruitsを引数として関数find_in_listを呼び出すと、両方のインデックスが返されることがわかります。

 target = "turnip" find_in_list(target,fruits) # Output Sorry, target not found!

fruitsリストにない'turnip'を検索しようとすると、ターゲットが見つからないというメッセージが表示されます。

forループとenumerate()関数の使用

Pythonでは、 enumerate()関数を使用して、 range()関数を使用せずに、インデックスとアイテムの両方に同時にアクセスできます。

次のコードセルは、 enumerate()関数を使用してインデックスとアイテムの両方を取得する方法を示しています。

 fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] for index,fruit in enumerate(fruits): print(f"Index {index}: {fruit}") # Output Index 0: apple Index 1: mango Index 2: strawberry Index 3: pomegranate Index 4: mango Index 5: melon

それでは、Python関数を書き直して、 enumerate()関数を使用してリスト内のアイテムのインデックスを見つけましょう。

 def find_in_list(target,py_list): target_indices = [] for index, fruit in enumerate(fruits): if fruit == target: target_indices.append(index) if target_indices == []: print("Sorry, target not found!") else: print(f"{target} is found at indices {target_indices}")

前のセクションと同様に、有効な引数を使用してfind_in_list関数を呼び出すことができます。

上記の関数定義を同等のリスト内包表記に変換できます。これについては、次のセクションで行います。

リスト内包表記を使用した反復によるリストアイテムのインデックスの検索

Pythonのリスト内包表記を使用すると、特定の条件に基づいて既存のリストからリストを作成できます。 一般的な構成は次のとおりです。

 new_list = [<output> for <items in existing iterables> if <condition is true>]

次の図は、リスト内包の要素を識別する方法を示しています。 これを使用して、関数find_in_listをリスト内包に変換できます。

python-find-in-list

以上を踏まえると、ターゲットインデックスを作成するためのリスト内包表記の式は次のようになります。

 target_indices = [index for index,fruit in enumerate(fruits) if fruit==target]

演習として、他のいくつかの例について、上記のコードスニペットを実行してみることができます。

index()メソッドを使用してリストアイテムのインデックスを検索する

Pythonリスト内のアイテムのインデックスを見つけるには、組み込みの.index()メソッドを使用することもできます。 一般的な構文は次のとおりです。

 list.index(value,start,end)

上記の方法の解析:

  • valueは、検索しているターゲット値です。
  • startendオプションの位置引数です。 それらを使用して、リストスライス内のアイテムのインデックスをstartからend - 1

.index()メソッドは、 list内で最初に出現するvalueのインデックスのみを返します。 リストスライス[start:end-1]でアイテムのインデックスが見つかった場合でも、このメソッドはアイテムの最初の出現に対応するインデックスのみを返します。

.index()メソッドがどのように機能するかを理解するために、例をもう一度見てみましょう。

 fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] target = "mango" fruits.index(target) 1

fruitsリストに'mango'が2回出現しているにもかかわらず、最初の出現のインデックスのみが返されていることがわかります。

2番目に出現するマンゴーのインデックスを取得するには、以下に示すように、インデックス2からインデックス5までのリストスライスを検索します。

 fruits.index(target,2,5) 4

PythonでValueErrorsを処理する方法

次に、リストに存在しないアイテムのインデックス(たとえば、 'carrot' )を見つけようとするとどうなるかを見てみましょう。

 target = "carrot" fruits.index(target) # Output --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-17-81bd454e44f7> in <module>() 1 target = "carrot" 2 ----> 3 fruits.index(target) ValueError: 'carrot' is not in list

上記のコードセルに見られるように、これはValueErrorをスローします。 Pythonでは、 tryブロックとexceptブロックを使用して、これを例外として処理できます。

try-exceptを使用する一般的な構文は次のとおりです。

 try: # to do this except <ErrorType>: # do this to handle <ErrorType> as exception

上記のtry-exceptブロックを使用すると、 ValueErrorを例外として処理できます。

 target = "carrot" try: fruits.index(target) except ValueError: print(f"Sorry, could not find {target} in list") # Output Sorry, could not find carrot in list

上記のコードは次のことを行います。

  • ターゲットがリストに存在する場合、ターゲットのインデックスを返します。
  • ターゲットが存在しない場合、ターゲットはValueErrorを例外として処理し、エラーメッセージを出力します。

まとめ

Pythonリストでアイテムのインデックスを見つけるために学習したさまざまな方法の概要を次に示します。

  • Pythonのforループとrange()関数を使用して、アイテムとそれぞれのインデックスを取得できます。 インデックスの項目がターゲットと一致するかどうかを確認します。
  • enumerate()関数を使用して、アイテムとインデックスに同時にアクセスすることもできます。
  • リスト内包表記式内で上記の両方のメソッドを使用できます。
  • リスト内のアイテムのインデックスを検索するには、組み込みの.index()メソッドを使用することもできます。
  • list.index(value)は、リスト内で最初に出現するのインデックスを返します。 値が存在しない場合は、 ValueErrorが発生します。
  • list.index(value、start、end)を使用してリストの特定のスライスを検索し、リストスライス[start:end-1]内の値の出現を検索できます。

次に、Pythonディクショナリをキーまたは値で並べ替える方法を学びます。 ハッピーPythonプログラミング!