【Python】listの要素のインデックスを取得する
Pythonのlistで指定した要素が含まれるインデックスの位置を取得する。
インデックスの探索範囲を指定することも可能。
同じ要素が複数個ある場合、探索範囲内で最初のインデックスが返ることに注意。
リストから要素を指定してインデックスを取得する
list.index(x)でxが最初に出てくるインデックスを取得できる。
1list_a = [1, 2, 3, 4, 5, 6]
2# list.index(x)でxが最初に出てくるのインデックス番号を取得
3idx = list_a.index(1)
4print(idx)
5# 0
同じ要素が複数個ある場合は、最初に見つかったインデックスが返される。
1list_b = [1, 2, 3, 3, 2, 1]
2# 同じ値が複数個ある場合、最初のインデックスが返される。
3idx = list_b.index(2)
4print(idx)
5# 1
探索範囲を指定してインデックスを取得する
list.index(x, a)とすることでインデックスがa以上の範囲で、要素を探索し、該当するインデックスを取得できる。
また、list.index(x, a, b)とすることで、探索範囲をa <= index < bにすることができる。bは含まれないことに注意。
1list_b = [1, 2, 3, 3, 2, 1]
2# list.index(x, a, b)でa<=index<bの範囲で値を探索して返す。
3# 値に2となるインデックスをインデックス4〜探索して返す
4idx = list_b.index(2, 4)
5print(idx)
6# 4
7
8# 値が2となるインデックスを2 <= index < 5の範囲で探索して返す
9idx = list_b.index(2, 2, 5)
10print(idx)
11# 4
スライスを使った場合のindexには注意が必要
list[n: m].index(a)でも、リストをスライスで範囲指定し、そこから該当する要素のインデックスを取得できるように見えるが、list.index(x, a, b)とは動作が異なるため、注意。
1list_b = [1, 2, 3, 3, 2, 1]
2# 似ているば動作が全く異なるので注意。
3idx = list_b[2:5].index(2)
4print(idx)
5# 2
上記の処理は以下のように分解してみると分かりやすい。
1list_b = [1, 2, 3, 3, 2, 1]
2# リストをスライスで範囲指定して新しいリストを作成
3list_b_2 = list_b[2:5]
4print(list_b_2)
5# 新しいリストから要素のインデックスを取得
6idx = list_b_2.index(2)
7print(idx)
8# [3, 3, 2]
9# 2
値がない場合はValueError
探索範囲に値がない場合、ValueErrorになる。
1list_b = [1, 2, 3, 3, 2, 1]
2# 探索範囲に値がないとValueError
3list_b.index(2, 2, 4)
4# ValueError: 2 is not in list
上記の例だと、「2」はindex=1と4に含まれるが、探索範囲が2 <= index < 4で、探索範囲には「2」が含まれない。
リストの値がユニークかを判定する
リストの値がユニークになっているか(同じ値の重複がないか)の判定は集合を使うと簡単に比較できる。
1# 重複なし
2list_a = [1, 2, 3, 4, 5, 6]
3set_a = set(list_a)
4
5len(list_a) == len(set_a)
6# True
7
8# 重複あり
9list_a = [1, 2, 3, 4, 4, 6]
10set_a = set(list_a)
11
12len(list_a) == len(set_a)
13# False
set()でリストを集合にすることで、リスト内に重複があれば、重複がなくなるため、元のリストとは長さが異なるようになる。
特定の要素が何個含まれるかを取得する
list.count(x)でリスト内にxが含まれている個数を取得できる。
1list_a = [1, 2, 3, 4, 3, 2]
2# list.count(x)でlistに含まれるxの数を返す。
3# 3の数を返す。
4cnt = list_a.count(3)
5print(cnt)
6# 2
7cnt = list_a.count(4)
8print(cnt)
9# 1
なお、指定した要素が0個の場合はエラーではなく0が返ってくる。
1# 要素が含まれていない場合は0が返ってくる
2cnt = list_a.count(5)
3print(cnt)
4# 0
まとめ
list.index(x, a, b)はリストの値がユニークに保証されている場合はそのまま使えばOK。
リストの値がユニークでない場合、最初のインデックスが取得されることを意識する必要がある。
特定要素がいくつあるかを調べたい場合はlist.count(x)を使えば良い。
1# 要素のindex番号取得
2list_a = [1, 2, 3, 4, 5, 6]
3# list.index(x)でxが最初に出てくるのインデックス番号を取得
4idx = list_a.index(1)
5print(idx)
6# 0
7
8list_b = [1, 2, 3, 3, 2, 1]
9# list.index(x, a, b)でa<=index<bの範囲で値を探索して返す。
10idx = list_b.index(2, 2, 5)
11print(idx)
12# 4
13
14# リストの要素重複確認
15set_a = set(list_a)
16len(list_a) == len(set_a)
17# True or False
18
19# 特定要素の個数取得
20list_a = [1, 2, 3, 4, 3, 2]
21# list.count(x)でlistに含まれるxの数を返す。
22cnt = list_a.count(3)
23print(cnt)
24# 2
25cnt = list_a.count(5)
26print(cnt)
27# 0