環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Pythonのリストから要素のインデックスを取得する:indexよりはenumerateを使う

最終更新日 2023.02.18

Python のリストは index で要素のインデックスを取得します。

a = [33, 66, 99]
b = a.index(33)
c = a.index(66)
d = a.index(99)

print(b)  # 0
print(c)  # 1
print(d)  # 2

インデックスは 1, 2, 3 ではなく 0, 1, 2 になっています。33 は 0 番目、66 は 1 番目、99 は 2 番目です。

リストが含まない要素を指定するとエラーが返ります。

a = [33, 66, 99]
b = a.index(5)

print(b)

# ValueError: 5 is not in list

5 はリストに含まれないという ValueError エラーが返っています。このエラーが出ると処理が止まってしまうので、index を使うときは次のようにするべきでしょう。

a = [33, 66, 99]
m = 66
n = 5

if m in a:
    i = a.index(m)
    print(i)
else:
    print('66はない')

if n in a:
    i = a.index(n)
    print(i)
else:
    print('5はない')

# 1
# 5はない

index を使う前に、調べたい要素がリストにあるかチェックして、存在するときに index を使います。

リストのリスト

リストにリストがあるときも同じです。

a = [[33, 66, 99], ['apple', 'lemon', 'peach']]
m = 66
n = ['apple', 'lemon', 'peach']

i = a.index(m)
j = a.index(n)

print(i)
print(j)

# ValueError: 66 is not in list

66 は子リストにありますが、リストそのものにはないので index を使うことはできません。

リストのインデックスは enumerate で求める

Python の開発で index を使うことはまれかもしれません。それは Python が enumerate という強力な道具を用意しているからです。

x = ['a', 'b', 'c']

for k, v in enumerate(x):
    print(k, v)
    print('---')

出力

0 a
---
1 b
---
2 c
---

リストのインデックスを使いたいときは、そのリストを enumerate に入れます。きちんと a のインデックス 0 が出力されています。

ちなみに下のコードはエラーです。

x = ['a', 'b', 'c']

for k, v in x:
    print(k, v)
    print('---')

# ValueError: not enough values to unpack (expected 2, got 1)

リストそれ自体をループで回しても、インデックスを 0, 1, 2, … と取り出すことはできません。enumerate を意識することは Python プログラマーにとって不可欠です。