Python リスト内の項目のインデックスを検索する方法

Python リスト内の項目のインデックスを検索する方法

このガイドでは、単純な反復と組み込みリスト メソッド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() 関数を使用して、イテラブルをループするときにインデックスを取得できます。

: 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-リスト内検索
Python-リスト内検索

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

前のセクションのリストfruitsを考えてみましょう。 forループを使用した反復によって、このリスト内の特定の項目のインデックスを検索する方法を学びます。

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

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

forループとrange()関数を使用して、 0からlen(fruits) - 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

ここで、 enumerate()関数を使用してリスト内の項目のインデックスを見つけるように Python 関数を書き直してみましょう。

 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-リスト内検索
Python-リスト内検索

上記を使用して、ターゲットインデックスを作成するためのリスト内包の式は次のようになります。

 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 番目に出現する mango のインデックスを取得するには、以下に示すように、インデックス 2 から開始してインデックス 5 までリスト スライスを検索します。

 fruits.index(target,2,5)
4

Python で ValueError を処理する方法

ここで、リストに存在しない項目 (たとえば'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-excel ブロッ​​クを使用すると、 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) は、 list内で最初に出現するvalueのインデックスを返します。値が存在しない場合は、 ValueErrorが発生します。
  • list.index(value, start, end)を使用してリストの特定のスライスを検索し、リスト スライス[start:end-1]内の値の出現を検索できます。

次に、Python 辞書をキーまたは値で並べ替える方法を学びます。 Python プログラミングを楽しんでください!

「 Python リスト内の項目のインデックスを検索する方法」についてわかりやすく解説!絶対に観るべきベスト2動画

【Python入門・応用】06.リスト|要素へのアクセス方法、追加や削除の仕方を学習しよう(初心者〜中級者向け)
【毎日Python】Pythonで文字列やリスト、データフレームからインデックスを指定して値を取得する方法|スライス操作