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

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

» 2023年10月04日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「解決!Python」のインデックス

連載目次

* 本稿は2020年12月18日に公開された記事をPython 3.12.0で動作確認したものです(確認日:2023年10月04日)。


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値を使うのがよいかもしれない。

 max関数とmin関数には複数のリストを渡すことも可能だ。この場合には、リスト同士で大小比較を行い最大のリスト/最小のリストが決定される。

 以下に例を示す。

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

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


 最後に、max関数/min関数にはkeyキーワード引数を指定して、要素の大小比較に何らかのロジックを介入させられる。keyキーワード引数には引数を1つ持つ関数(やラムダ式)を指定する。これは例えば、英単語を要素とするリストで、大文字/小文字を無視して大小比較を行うといったときに役立つ。

 以下に例を示す。

mylist = ['pYthon', 'pyThon', 'Python', 'PYTHON']

max_value = max(mylist)  # 辞書式順序で最大の要素を検索
print(max_value)  # pyThon

max_value = max(mylist, key=str.lower)  # 全てを小文字化すると
print(max_value)  # pYthon

min_value = min(mylist)  # 辞書式順序で最小の要素を検索
print(min_value)  # PYTHON

min_value = min(mylist, key=str.lower)  # 全てを小文字化すると
print(min_value)  # pYthon


 この例では、「python」という単語内で大文字/小文字を混在させたものを要素とするリストを対象に最大の要素、最小の要素を調べている。Pythonでは文字列を比較する際に、大文字が小文字よりも小さく、アルファベット順で前にあるものが後ろにあるものよりも小さくなる。

 そのため、keyキーワード引数を指定していない最初のmax関数呼び出しでは、大文字の「P」で始まるものよりも小文字の「p」で始まるものが大きくなり(「pYthon」か「pyThon」が最大)、さらに2文字目の「Y」と「y」の大小関係は小文字の方が大きいので、結果、「pyThon」が最大値となっている。

 これに対して、keyキーワード引数にstr.lowerメソッドを指定して、全てを小文字化して大小比較を行っている2つ目のmax関数では全ての要素が「python」として比較される。このときには、全ての要素が等しくなるが、そのときには等しい要素の中で先頭にあるものが戻り値となる(仕様)。そのため、戻り値は「pYthon」となっている。

 min関数でも同様なので、こちらについては説明を省略する。

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

解決!Python

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

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

メールマガジン登録

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