このガイドでは、単純な反復と組み込みリスト メソッド 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 リストの基本を説明したので、リスト内の項目のインデックスを検索する方法を学びましょう。
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]
target
と
fruits
を引数として関数
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
リスト内包表記に変換できます。
上記を使用して、ターゲットインデックスを作成するためのリスト内包の式は次のようになります。
target_indices = [index for index,fruit in enumerate(fruits) if fruit==target]
演習として、他のいくつかの例について上記のコード スニペットを実行してみることができます。
Index() メソッドを使用してリスト項目のインデックスを検索する
Python リスト内の項目のインデックスを検索するには、組み込みの
.index()
メソッドを使用することもできます。一般的な構文は次のとおりです。
list.index(value,start,end)
上記のメソッドを解析すると、次のようになります。
-
value
は、検索するターゲット値です。 -
start
とend
は オプションの 位置引数です。これらを使用して、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 プログラミングを楽しんでください!