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 プログラマーにとって不可欠です。