リストは、他のデータ型とは異なり、汎用性が高いため、さまざまな場面で役立ちます。
この記事では、リストに関する最も一般的な操作の1つである、要素のインデックスを見つけることについて見ていきます。
要素を見つけるためのさまざまなシナリオ、つまり、要素の最初、最後、およびすべての出現を見つけることについて見ていきます。
また、探している要素が存在しない場合の処理についても説明します。
index()関数の使い方
前の段落で述べたすべての操作は、組み込みの index()
関数で行うことができます。
この関数のシンタックスは index(element[, start[, end]])
です。
パラメータ element
は当然ながら、探している要素を表します。
startと
endパラメータはオプションで、
element` を探すためのインデックスの範囲を表します。
startのデフォルト値は
0(先頭から検索する)であり、
end` のデフォルト値はリストの要素数(リストの最後まで検索する)である。
この関数は、リスト内で最初に見つかった element
の位置を返します。
これは、最初に見つかった要素の後に、同じ要素がいくつあってもかまいません。
ある元素の最初の出現箇所を探す
startと
endに何も指定せずに
index()関数を使用すると、探している
element` の最初の出現位置を得ることができます。
my_list = ['a', 'b', 'c', 'd', 'e', '1', '2', '3', 'b']
first_occurrence = my_list.index('b')
print("First occurrence of 'b' in the list: ", first_occurrence)
これは期待通りの出力になります。
First occurrence of 'b' in the list: 1
要素の全出現回数の検索
ある要素のすべての出現箇所を見つけるために、オプションのパラメータ start
を使用して、リストの特定のセグメントのみを検索することができます。
例えば、インデックス 3
にある要素の最初の出現を見つけるとします。
次の要素を見つけるには、インデックス 3
以降にその要素が最初に現れる場所を探し続ける必要があります。
このプロセスを、検索を開始する場所を変えながら、その要素の新しい出現を見つける限り、繰り返すことになります。
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a']
all_occurrences = []
last_found_index = -1
element_found = True
while element_found:
try:
last_found_index = my_list.index('a', last_found_index + 1)
all_occurrences.append(last_found_index)
except ValueError:
element_found = False
if len(all_occurrences) == 0:
print("The element wasn't found in the list")
else:
print("The element was found at: " + str(all_occurrences))
このコードを実行すると、次のようになります。
The element was found at: [1, 5, 7]
なぜなら、 index()
関数は指定された範囲内で指定された element
を見つけることができないと、エラーを投げるからです。
これは、他の言語に慣れている開発者にとっては珍しいことかもしれません。
なぜなら、このような関数は要素が見つからない場合、通常 -1
/null
を返すからです。
しかし、Pythonでは、この関数を使用するときは、 try
ブロックを使用して、注意深く行わなければなりません。
これと同じことを行うには、リスト内包を使用して、 index()
関数を完全に無視するという、よりすっきりした方法もあります。
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a']
all_occurrences = [index for index, element in enumerate(my_list) if element == 'a']
print("The element was found at: " + str(all_occurrences))
この場合、前と同じ出力が得られます。
この方法では、try
ブロックを使わないという利点もあります。
要素の最後の出現箇所を探す
リスト内で最後に出現した要素を見つける必要がある場合、 index()
関数を用いて2つのアプローチをとることができます。
- リストを反転させ、反転後のリストで最初に出現する要素を探す。
- リストを逆順にして、逆順のリストで最初に現れる要素を探す。
最初の方法に関しては、もし element
が反転したリストの中で最初に出現する場所がわかれば、元のリストで最後に出現する場所を見つけることができます。
具体的には、元のリストの長さから reversed_list_index - 1
を引くことで、これを行うことができます。
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a']
reversed_list_index = my_list[::-1].index('n')
# or alteratively:
# reversed_list_index2 = list(reversed(my_list)).index('n')
original_list_index = len(my_list) - 1 - reversed_list_index
print(original_list_index)
ということで、次のような出力が得られます。
6
2番目の方法として、すべての出現を見つけるために使ったコードを微調整して、最後に見つけた出現だけを記録することができます。
my_list = ['b', 'a', 2, 'n', False, 'a', 'n', 'a']
last_occurrence = -1
element_found = True
while element_found:
try:
last_occurrence = my_list.index('n', last_occurrence + 1)
except ValueError:
element_found = False
if last_occurrence == -1:
print("The element wasn't found in the list")
else:
print("The last occurrence of the element is at: ", last_occurrence)
これは、同じ出力を得ることができます。
6
結論
index()` 関数の最も一般的な使用例と、場合によってはそれを避ける方法について見てきました。
リスト内に要素が見つからない場合に、 -1
/None
を返す代わりにエラーを投げるという、 index()
関数の異常な振る舞いを覚えておいてください。