Pythonのリストの要素のインデックス(何番目か)を取得

Pythonのリスト(配列)の要素のインデックス、つまりその要素が何番目に格納されているかを取得する方法を説明します。 以下の内容について説明します。

リストの要素が重複していない場合: index() リストの要素が重複している場合: index(), enumerate(), リスト内包表記 タプルでも同様

リストの要素が重複していない場合: index()

リストの要素が重複していない場合、index()メソッドを使います。 index()の引数に調べたい値を指定すると0始まりのインデックスが取得できます。

l = list('abcde')
print(l)
# ['a', 'b', 'c', 'd', 'e']

print(l.index('a'))
# 0

print(l.index('c'))
# 2

リストに含まれていない値を指定するとエラーValueErrorになるので気をつけてください。

# print(l.index('x'))
# ValueError: 'x' is not in list

リストに含まれていない値に対して任意の値を返したい場合は、例えば以下のような関数を定義します。

def my_index(l, x, default=False):
    if x in l:
        return l.index(x)
    else:
        return default

print(my_index(l, 'd'))
# 3

print(my_index(l, 'x'))
# False

print(my_index(l, 'x', -1))
# -1

リストの要素が重複している場合: index(), enumerate(), リスト内包表記

リストの要素が重複している場合、index()メソッドは最初のインデックスのみを返します。

l_dup = list('abcba')
print(l_dup)
# ['a', 'b', 'c', 'b', 'a']

print(l_dup.index('a'))
# 0

print(l_dup.index('b'))
# 1

それで問題なければindex()をそのまま使えばいいが、すべてのインデックスをリストで取得したい場合は、組み込み関数enumerate()とリスト内包表記を利用します。

print([i for i, x in enumerate(l_dup) if x == 'a'])
# [0, 4]

print([i for i, x in enumerate(l_dup) if x == 'b'])
# [1, 3]

要素が一つだけ含まれている場合もリストを返します。

print([i for i, x in enumerate(l_dup) if x == 'c'])
# [2]

リストに含まれていない値に対しては空のリストを返します。

print([i for i, x in enumerate(l_dup) if x == 'x'])
# []

繰り返し使うなら関数にしておくと便利です。

def my_index_multi(l, x):
    return [i for i, _x in enumerate(l) if _x == x]

print(my_index_multi(l_dup, 'a'))
# [0, 4]

print(my_index_multi(l_dup, 'c'))
# [2]

print(my_index_multi(l_dup, 'x'))
# []

なお、リストから重複した要素を削除したり抽出したりしたい場合は

タプルでも同様

これまではリストを例にしていたが、タプルも同様にindex()メソッドを持っています。

t = tuple('abcde')
print(t)
# ('a', 'b', 'c', 'd', 'e')

print(t.index('a'))
# 0

# print(t.index('x'))
# ValueError: tuple.index(x): x not in tuple

上で定義した関数はタプルに対してもそのまま使えます。

print(my_index(t, 'c'))
# 2

print(my_index(t, 'x'))
# False

t_dup = tuple('abcba')
print(t_dup)
# ('a', 'b', 'c', 'b', 'a')

print(my_index_multi(t_dup, 'a'))
# [0, 4]
Last Updated: 6/26/2019, 10:34:03 PM