連載
» 2020年12月18日 05時00分 公開

[解決!Python]リスト(配列)から要素を検索するには(in/not in演算子、count/indexメソッド、min/max関数)解決!Python

リスト(配列)に特定の値が含まれているか含まれていないか、特定の値が何個含まれているか、特定の値がどこにあるか、最大値と最小値は何かを検索するための方法を紹介する。

[かわさきしんじ,Deep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

mylist = [2, 5, 11, 15, 1, 3, 18, 3, 19, 8# 10個の整数値を要素とするリスト

# 指定した値がリストに含まれているか含まれていないかを調べる
result = 0 in mylist  # 整数値0がmylistに含まれているかを調べる
print(result)  # False

result = 0 not in mylist  # 整数値0がmylistに含まれていないかを調べる
print(result)  # True

# 指定した値がリストに何個含まれているかを調べる
cnt = mylist.count(3# 整数値3がmylistに何個含まれているかを調べる
print(cnt)  # 2

# 指定した値がどのインデックスにあるかを検索
idx = mylist.index(3# mylistに含まれる整数値3の最小のインデックスを求める
print(idx)  # 5

idx = mylist.index(3, 6, len(mylist))  # 検索範囲を指定
print(idx)  # 7

idx = mylist.index(100# ValueError:存在しない値を指定

# リストの要素で最大/最小のものを求める
max_value = max(mylist)  # 最大値を求める
print(max_value)  # 19

min_value = min(mylist)  # 最小値を求める
print(min_value)  # 1

max_value = max([])  # ValueError:max関数/min関数に空のリストを渡すと例外
max_value = max([], default='none'# defalut引数は空リストを渡したときの戻り値
print(max_value)  # none

max_value = max([0, 1], [4, 5], [2, 3])  # 複数のリストの中で最大のリストを取得
print(max_value)  # [4, 5]

mylist = ['pYthon', 'pyThon', 'Python', 'PYTHON']
max_value = max(mylist, key=str.lower)  # key引数を指定する例
print(max_value)  # pYthon


指定した値がリストに含まれているか含まれていないかを調べる

 リスト(配列)に特定の値が含まれているか含まれていないかを調べるだけであれば、in演算子/not in演算子を使える。in演算子はその左側に置いた被演算子が右側に置いた被演算子であるリストに含まれていればTrueを、そうでなければFalseを返す。not in演算子はその反対の動作をする。

mylist = [15, 8, 1, 0, 20, 19, 1, 2, 13, 7]

# 整数値0がmylistに含まれているかどうかを調べる
result = 0 in mylist
print(result)  # True

# 整数値5がmylistに含まれているかどうかを調べる
result = 5 in mylist
print(result)  # False

# 整数値0がmylistに含まれていないかどうかを調べる
result = 0 not in mylist
print(result)  # False

# 整数値5がmylistに含まれていないかどうかを調べる
result = 5 not in mylist
print(result)  # True


 最初の2つの例は整数値0または5がリストmylistに含まれているかどうかを調べている。次の2つの例は同じ2つの値が含まれていないかどうかを調べている。整数値0について調べたとき、mylistにこれは含まれているので、in演算子の結果はTrueで、not in演算子の結果はFalseとなる。整数値5はリストには含まれていないので、in演算子の結果はFalseで、not in演算子の結果はTrueとなっている。

 in演算子とnot in演算子はあくまでも、リストに特定の要素が含まれているかどうか、つまり存在確認を行うだけで、その値が何個含まれているかや、含まれているとしてどのインデックスに存在しているかなどまでを知るには、以下で紹介するcountメソッドやindexメソッドを使用する。

指定した値がリストに何個含まれているかを調べる

 リスト(配列)に、ある要素が何個含まれているかを調べるにはcountメソッドを使用する。引数には、何個含まれているかを調べたい値を1つだけ指定する。

mylist = [15, 8, 1, 0, 20, 19, 1, 2, 13, 7]

cnt = mylist.count(1# 整数値1がmylistに何個含まれているかを調べる
print(cnt)  # 2

cnt = mylist.count(100# 指定した値が含まれていないと0が返される
print(cnt)  # 0


指定した値がどのインデックスにあるかを検索

 indexメソッドは、引数に指定した値がリストのどの位置(インデックス)にあるかを返す。その値がリストに存在しない場合はValueError例外が発生する。また、第2引数と第3引数には、検索を開始する位置と終了する位置を指定できる。

 以下に例を示す。

mylist = [2, 5, 11, 15, 1, 3, 18, 3, 19, 8]

idx = mylist.index(3# mylistに含まれている整数値3の最小のインデックスを調べる
print(idx)  # 5

idx = mylist.index(3, 6, len(mylist))  # 検索範囲を指定
print(idx)  # 7

idx = mylist.index(100# ValueError:存在しない値を指定


 最初の例では、リストmylistから整数値3のインデックスを検索している。mylistには整数値3が2つ含まれていて、そのインデックスは5と7だ。そして、indexメソッドの戻り値は5となっている。indexメソッドは、リスト中で指定した値が最初に登場するインデックスの値を返す仕様になっている。

 次の例は、同じく整数値3があるインデックスをmylistから検索しているが、今度は第2引数と第3引数に検索開始位置と検索終了位置を指定している。ここでは末尾までを検索するように第3引数に「リストの長さ」を指定している(末尾までを検索するのであれば、第3引数の指定は不要だが、ここでは検索終了位置を指定する例として明示した)。

 最後の例は、リストには含まれないものを指定した場合だ。このときには、既に述べた通り、ValueError例外が発生する。

 上で見たcountメソッドとindexメソッドを使うと、リスト内にある特定の値のインデックスを列挙できる。

mylist = [2, 5, 11, 15, 1, 3, 18, 3, 19, 8]

tgt = 3
idx = -1
result = []
for cnt in range(mylist.count(tgt)):
    idx = mylist.index(tgt, idx+1)
    result.append(idx)

print(result)  # [5, 7]


 リスト内包表記を使うと次のようになる。ただし、代入式を使っているので、このコードを実行できるのはPython 3.8以降となる。

mylist = [2, 5, 11, 15, 1, 3, 18, 3, 19, 8]
idx = -1
tgt = 3

result = [idx := mylist.index(tgt, idx+1) for cnt in range(mylist.count(tgt))]
print(result)  # [5, 7]


リストの要素で最大/最小のものを求める

 リスト(配列)に格納されている要素から最大値を検索するにはPythonに組み込みのmax関数を、最小値を検索するにはmin関数を使用する。

 max関数とmin関数の基本的な使い方は、リストを1つだけ渡すものだ。このとき、空のリストを渡すとValueError例外が発生することには注意しよう。以下の例では、空のリストを明示的に渡しているので、「こんなことをするはずがない」と思うだろうが、何かの関数を呼び出して得たリストをmax関数/min関数に渡すというときには、それが空である可能性はある。

mylist = [2, 5, 11, 15, 1, 3, 18, 3, 19, 8# 10個の整数値を要素とするリスト

vmax = max(mylist)  # 最大値を求める
print(vmax)  # 19

min_value = min(mylist)  # 最小値を求める
print(min_value)  # 1

max_value = max([])  # ValueError:空のリストを渡すと例外となる
min_value = min([])  # ValueError:空のリストを渡すと例外となる


 空のリストを渡してしまったときに、例外ではなく何らかの値を受け取りたいのであれば、defaultキーワード引数を指定する。

max_value = max([], default='none'# defalut引数は空リストを渡したときの戻り値
print(max_value)  # none

min_value = min([], default='none'# defalut引数は空リストを渡したときの戻り値
print(min_value)  # none


 defaultキーワード引数の値をどうするかは難しい。というのは、Pythonではインデックスを表す整数には正値でも0でも負値でも使えるからだ。範囲外のインデックスとなるような値を使うのは一案かもしれないが、Python 3.8以降ではdefaultキーワード引数の値としてNone値を指定できるようになっているので、上の例では文字列の'none'としたが、None値を使うのがよいかもしれない。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。