こんにちは。現役Webエンジニアの三年坊主です。
今回は、Pythonでリストを検索する方法を知りたい人の、このような疑問に答えます。
この記事では、大学の研究・自分の趣味・業務で合わせて5年以上Pythonを使ってきた経験を生かして、Pythonでリストを検索する方法を紹介します。
この記事の内容
- 要素の検索(in演算子)
- 要素の検索(indexメソッド)
- 要素の検索(countメソッド)
- リストの要素が重複しているとき
- 実務で使えるリストの検索
要素の検索(in演算子)
ある要素がリストに含まれているかどうか知りたいときに、in演算子を使って調べることができます。
演算子 in および not in は、帰属 (membership) を調べます。 x in s の評価は、 x が s の要素であれば True となり、そうでなければ False となります。
1 2 3 4 5 6 7 | list_1 = [0, 1, 2, 3, 4] # 2はlist_1の要素なのでTrue print(2 in list_1) # 5はlist_1の要素なのでFalse print(5 in list_1) |
出力結果
1 2 | True False |
要素の検索(indexメソッド)
要素のインデックス(リストの何番目の要素か)を知りたいとき、indexメソッドを使って検索することができます。
演算 結果 s.index(x[, i[, j]]) s 中で x が最初に出現するインデックス (インデックス i 以降からインデックス j までの範囲)
1 2 3 4 5 6 7 8 9 10 11 | list_2 = [4, 8, 12, 16, 3] print(list_2.index(3)) list_3 = [4, 3, 12, 16, 3] print(list_3.index(3)) # 部分リスト[12, 16, 3]に3が含まれているのでインデックス4が返ってくる(インデックスはlist_3全体の中での位置) print(list_3.index(3, 2, 5)) # 部分リスト[12, 16]に3が含まれていないのでValueError print(list_3.index(3, 2, 4)) |
出力結果
1 2 3 4 5 6 7 8 9 10 | 4 1 4 ValueErrorTraceback (most recent call last) <ipython-input-31-5471694ca86a> in <module>() 6 7 # 部分リスト[12, 16]に3が含まれていないのでValueError ----> 8 print(list_3.index(3, 2, 4)) ValueError: 3 is not in list |
1 2 | list_4 = [4, 8, 12, 16, 5] print(list_4.index(3)) |
出力結果
1 2 3 4 5 6 | ValueErrorTraceback (most recent call last) <ipython-input-10-7b2d05599830> in <module>() 1 list_4 = [4, 8, 12, 16, 5] ----> 2 print(list_4.index(3)) ValueError: 3 is not in list |
要素の検索(countメソッド)
リストに含まれる要素の個数を知りたいとき、countメソッドを使うことができます。
演算 結果 s.count(x) s 中に x が出現する回数
1 2 | list_3 = [4, 3, 12, 16, 3] print(list_3.count(3)) |
出力結果
1 | 2 |
リストの要素が重複しているとき
リストに同じ値が複数含まれているとき、そのすべてのインデックスを取得するには、組み込み関数のenumerateを使ってインデックスと値のペアを確認しながら、条件に合う要素を取り出します。
enumerate(iterable, start=0)
enumerate オブジェクトを返します。 iterable は、シーケンスか iterator か、あるいはイテレーションをサポートするその他のオブジェクトでなければなりません。
(中略)
12345 def enumerate(sequence, start=0):n = startfor elem in sequence:yield n, elemn += 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | list_3 = [4, 3, 12, 16, 3] # 3はlist_3に2つ含まれている print(list_3.count(3)) # インデックスと値のペアを確認しながら条件に合う要素を取り出す indexes_1 = [] for i, x in enumerate(list_3): if x == 3: indexes_1.append(i) print(indexes_1) # リストの内包表記を使っても同じ結果が得られる indexes_2 = [i for i, x in enumerate(list_3) if x == 3] print(indexes_2) |
出力結果
1 2 3 | 2 [1, 4] [1, 4] |
実務で使えるリストの検索
Pythonでのリスト検索が使われる場面をより具体的にイメージするために、今回説明した「リストの検索」を業務や趣味プログラミングで実際に活用した例をいくつか紹介します。
システムのステータスに応じて処理を行う(in演算子)
1 2 3 4 5 6 7 8 9 10 11 12 | STATUS_OPEN = 0 STATUS_IN_PROGRESS = 1 STATUS_REVIEW = 2 STATUS_PENDING = 3 STATUS_CLOSED = 4 # statusの値はたとえばデータベースから取得する status = 1 if status in (STATUS_IN_PROGRESS, STATUS_REVIEW): print('進行中またはレビュー中です。処理を行います。') else: print('処理を行いません。') |
出力結果
1 | 進行中またはレビュー中です。処理を行います。 |
HTTPレスポンスに必要なフィールドが含まれるか確認する(in演算子)
requestsライブラリでHTTPリクエストを作成して、そのレスポンスに必要なフィールドが含まれるか確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import requests # GETリクエストを作成し、そのレスポンスをjsonデータとして扱う r = requests.get('https://github.com/timeline.json') r_json = r.json() # jsonデータ内にmessageフィールドがなければExceptionを発生させる if 'message' not in r_json: raise Exception('messageフィールドが見つかりません') # messageフィールドを使った処理(messageフィールドがなければここにたどりつかない) print(r_json['message']) # jsonデータ内にrepositoryフィールドがなければExceptionを発生させる if 'repository' not in r_json: raise Exception('repositoryフィールドが見つかりません') # repositoryフィールドを使った処理(repositoryフィールドがなければここにたどりつかない) print(r_json['repository']) |
出力結果
1 2 3 4 5 6 7 8 9 10 11 | Hello there, wayfaring stranger. If you’re reading this then you probably didn’t see our blog post a couple of years back announcing that this API would go away: http://git.io/17AROg Fear not, you should be able to get what you need from the shiny new Events API instead. ExceptionTraceback (most recent call last) <ipython-input-25-a4a0aadf913c> in <module>() 16 # jsonデータ内にrepositoryフィールドがなければExceptionを発生させる 17 if 'repository' not in r_json: ---> 18 raise Exception('repositoryフィールドが見つかりません') 19 20 # repositoryフィールドを使った処理(repositoryフィールドがなければここにたどりつかない) Exception: repositoryフィールドが見つかりません |
指定したヘッダーがリストの何番目にあるか(indexメソッド)
Pythonでcsvファイルの読み込みで紹介したcsv.readerを使うときなど、指定したヘッダーがリストの何番目にあるか検索しておいて、そのインデックスをあとで使うことができます。
1 2 3 4 5 6 7 8 9 | CSV_HEADER_LIST = ['種別', 'ご利用年月日', 'ご利用場所', 'ご利用内容', 'ご利用金額', '支払区分', 'お支払い開始月', '備考'] use_date_index = CSV_HEADER_LIST.index('ご利用年月日') use_place_index = CSV_HEADER_LIST.index('ご利用場所') use_amount_index = CSV_HEADER_LIST.index('ご利用金額') print(use_date_index, use_place_index, use_amount_index) # csv.readerを使ってファイルを読み込んで中身を見るとき、row[use_date_index]のように、必要なフィールドを指定できる |
出力結果
1 | (1, 2, 4) |
Pythonでリストを検索する方法を身につけて、明日から実務で活躍できるエンジニアになりましょう。