note.nkmk.me

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

Date: 2018-07-02 / tags: 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]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事