Pythonをいじっていれば、リストをよく活用すると思います。
そんなリストの中から特定の値だけを検索したいと思った事はありませんか?
今回はリスト内に含まれる値の検索方法についてご紹介します。
■前提知識
・Pythonの基本が理解できている
・Pythonの実行環境が整っている
コンテンツ
リスト内の検索方法について
リスト内に値があるかを調べたい – in
リスト内に値が含まれているかどうかを調べてみたいと思います。
以下の様な値があるとします。
1 |
list_wk = [1,2,3,4,5,6,7,8,9,10] |
この中に「5」という値が含まれているかどうかを知りたい場合、以下のコードで確認できます。
■Pythonコード
1 2 |
list_wk = [1,2,3,4,5,6,7,8,9,10] print(5 in list_wk) |
■実行結果
1 |
True |
「5」が含まれているので、「True」が返ってきました。
ちなみに、リストに含まれていない「11」を指定すると、
■Pythonコード
1 2 |
list_wk = [1,2,3,4,5,6,7,8,9,10] print(11 in list_wk) |
■実行結果
1 |
False |
Falseが返ってきます。
リスト内の何番目なのかを知りたい – index
次はリスト内にある値が何番目なのか(添え字)を知りたい場合のコードです。
■Pythonコード
1 2 |
list_wk = [1,2,3,4,5,6,7,8,9,10] print(list_wk.index(5)) |
■実行結果
1 |
4 |
「5」という値はリストの4番目(0から数えて)に入っているので、正しくインデックスを取得できている事が分かります。
ちなみに、この中に含まれていない値を指定すると、
■Pythonコード
1 2 |
list_wk = [1,2,3,4,5,6,7,8,9,10] print(list_wk.index(11)) |
■実行結果
1 |
ValueError: 11 is not in list |
エラーが発生してしまいます。
例外エラーで処理に影響を与えない様にはじく方法もありますが、一旦存在確認(上記の「in」を使う)をしてから使った方が良さそうです。
リスト内に特定の値が何個含まれるのかを知りたい – count
次はリスト内に値が何個含まれているかを調べる方法です。
個数を調べる場合には「count」を使用します。
■Pythonコード(リストの中に「5」が2つあります)
1 2 |
list_wk = [1,2,3,4,5,6,7,8,9,5] print(list_wk.count(5)) |
■実行結果
1 |
2 |
ちなみに存在しない値を指定すると、
■Pythonコード
1 2 |
list_wk = [1,2,3,4,5,6,7,8,9,5] print(list_wk.count(10)) |
■実行結果
1 |
0 #値が存在しない |
0が返ってきます。※エラーにはなりません。
リストに値が複数個存在する場合に、全ての値のindexを取得 – in & enumerate
次はリストの中に検索対象の値が複数個含まれている場合です。
対象の値が何番目に含まれているか全てのインデックスを取得したいケースを考えます。
以下の様なリストがあったとします。
1 |
list_wk = [1,2,3,4,5,6,7,8,9,1] #1が2つ含まれている |
これに対して上記と同じ様に「index」を使うと、
1 |
0 #リストの0番目 |
あれ?「1」は0番目と9番目の2つ存在しているのに、0番目のインデックスしか返ってきません。どうやら、値が見つかった時点で検索を終了する様です。
全てのインデックスを取得したい場合は以下の様に記述します。
■Pythonコード
1 2 |
list_wk = [1,2,3,4,5,6,7,8,9,1] print([i for i, j in enumerate(list_wk) if j == 1]) |
■実行結果
1 |
[0, 9] |
0番目、9番目をしっかりと返してきてくれます。
少し複雑な記載に見えるかもしれませんが、定型文の様に以下の記述を覚えておけばOKです。
1 |
[i for i, j in enumerate(リストの名前) if j == 検索対象の値] |
実用的なリスト内の検索方法
基本的な事は上記でお伝えしましたが、実際にシステムなどを作る時はもう少し複雑(というか面倒な)コードを書く必要があります。
こんな場合はどうやって値を検索する?
例えば以下の様リスト(list_wk1)があったとします。
■Pythonコード
1 2 3 4 5 6 7 8 9 |
import random list_wk1 = [] for j in range(3): list_wk2 = [random.randint(1, 5) for i in range(3)] list_wk1.append(list_wk2) print(list_wk1) |
■実行結果
1 |
[[1, 2, 4], [2, 3, 3], [4, 2, 5]] |
■コードの意味
list_wk1というリストの中に3つのリスト「list_wk2 」を作成します。
list_wk2は1~5までの値からランダムな値を3つ設定しています。
文章で書くと伝わりにくいかもしれませんが、コードと実行結果を見ていただければ、やっている事の意味は分かるかと思います。
値を検索をしてみる
上記で出力されたランダムな3つの値×3つの配列の中に、例えば「3」という数字が何個入っているか?を調査したいとします。
データベースの値などをメモリ上で処理する様な仕様になっている場合、この様なケースが結構あります。
一つのリストに対しては、先ほどのcountが使えそうです。
これを複数のリストに対して繰り返す処理になります。
■Pythonコード
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import random list_wk1 = [] for j in range(3): list_wk2 = [random.randint(1, 5) for i in range(3)] list_wk1.append(list_wk2) print(list_wk1) search_val = 3 for z in range(len(list_wk1)):#配列の長さまで繰り返す print(str(z)+"番目に"+str(search_val)+"が"+str(list_wk1[z].count(search_val))+"個含まれている。") |
■実行結果
1 2 3 4 |
[[3, 4, 2], [4, 1, 2], [3, 3, 3]] 0番目に3が1個含まれている。 1番目に3が0個含まれている。 2番目に3が3個含まれている。 |
list_wk1の中のそれぞれのリストに「3」がいくつ含まれているかを出力してくれます。
リスト内包表記などを使うと1行で書く事も可能ですが、可読性を考えて調度良いコードを書きましょう。
まとめ
リストの中から必要な値を検索したり、値が何番目に格納されているか?などを調べる方法についてご紹介をしました。
大規模なプログラムになると、このまま使えないなんて事もあるかもしれません。その時はfor文などを使って無難に検索していって良いと思います。無理をしてスリムに記述すると見にくいコードになってしまうからです。
今回紹介した方法を基にしていただければ、リスト内の値の調査は問題無いと思います。