Pythonのリストの要素のインデックス(何番目か)を取得
Pythonのリスト(配列)の要素のインデックス、つまり、その要素が何番目に格納されているかを取得するにはindex()メソッドを使う。
リストのindex()メソッドの使い方
リストのindex()メソッドの引数に検索したい値を指定すると、その値のインデックス(0始まり)を取得できる。
l = [30, 50, 10, 40, 20]
print(l.index(30))
# 0
print(l.index(20))
# 4
リストに含まれていない値を指定するとエラーValueErrorになるので注意。
# print(l.index(100))
# ValueError: 100 is not in list
find()メソッド相当の関数を実装(存在しない値に-1を返す)
文字列strには部分文字列が含まれない場合に-1を返すfind()メソッドがあるが、リストにはそのようなメソッドはない(Python 3.11時点)。
文字列のfind()メソッドのように、リストに存在しない値に対して-1を返すには、例えば以下のような関数を定義する。in演算子で存在確認をしている。
def my_find(l, x):
if x in l:
return l.index(x)
else:
return -1
l = [30, 50, 10, 40, 20]
print(my_find(l, 30))
# 0
print(my_find(l, 100))
# -1
三項演算子を使うとシンプルに書ける。
def my_find2(l, x):
return l.index(x) if x in l else -1
print(my_find2(l, 30))
# 0
print(my_find2(l, 100))
# -1
重複する要素のすべてのインデックスを取得
リストの要素が重複している場合、index()メソッドは最初のインデックスのみを返す。
l = [10, 30, 10, 10, 20, 20]
print(l.index(10))
# 0
print(l.index(20))
# 4
すべてのインデックスを取得したい場合は、組み込み関数enumerate()とリスト内包表記を利用する。
一つだけの要素に対しては要素数一個のリストを返し、存在しない要素に対しては空のリストを返す。
print([i for i, x in enumerate(l) if x == 10])
# [0, 2, 3]
print([i for i, x in enumerate(l) if x == 20])
# [4, 5]
print([i for i, x in enumerate(l) if x == 30])
# [1]
print([i for i, x in enumerate(l) if x == 100])
# []
繰り返し使うなら関数にしておくと便利。
def my_index_multi(l, x):
return [i for i, _x in enumerate(l) if _x == x]
print(my_index_multi(l, 10))
# [0, 2, 3]
リストから重複した要素を削除したり抽出したりしたい場合は以下の記事を参照。
index()メソッドの対象範囲を指定
index()メソッドの第二引数iと第三引数jを指定すると、対象の範囲をi番目からj番目まで(j番目は含まない)に限定できる。第三引数jを省略した場合は末尾までが範囲となる。
範囲を指定した場合も、リストの先頭を0としたインデックスが返される。
l = [10, 30, 10, 10, 20, 20]
print(l.index(10))
# 0
print(l.index(10, 2))
# 2
# print(l.index(20, 2, 4))
# ValueError: 20 is not in list
print(l.index(20, 2, 5))
# 4
l.index(x, i, j)とスライスを使うl[i:j].index(x)は対象範囲は同じだが、スライスを使う場合はスライスの先頭を0としたインデックスが返される。
print(l[2:])
# [10, 10, 20, 20]
print(l[2:].index(10))
# 0
print(l[2:5])
# [10, 10, 20]
print(l[2:5].index(20))
# 2
タプルのインデックスを取得
これまではリストを例にしていたが、タプルも同様にindex()メソッドを持っている。
t = ('c', 'a', 'a', 'b', 'c')
print(t.index('a'))
# 1
# print(t.index('x'))
# ValueError: tuple.index(x): x not in tuple
上で定義した関数はタプルに対してもそのまま使える。
print(my_find(t, 'a'))
# 1
print(my_find(t, 'x'))
# -1
print(my_index_multi(t, 'a'))
# [1, 2]
print(my_index_multi(t, 'x'))
# []
具体例: 最大値・最小値のインデックス(位置)を取得
具体的な活用例として、リストの最大値・最小値のインデックス(位置)を取得する例を示す。
index()の引数にmax(), min()を指定すればよい。
上で定義した関数を使った例も合わせて示す。
l = [10, 30, 10, 10, 20, 20]
print(l.index(max(l)))
# 1
print(l.index(min(l)))
# 0
print(my_index_multi(l, max(l)))
# [1]
print(my_index_multi(l, min(l)))
# [0, 2, 3]
なお、NumPyでは配列numpy.ndarrayの最大値・最小値のインデックス(位置)を返す関数・メソッドargmax(), argmin()が提供されている。