はじめに
paiza x Qiita のプログラミング問題 の 文字列収集 について, re.match()
を使って解きました.
でも, 一部の問題に秒単位の実行時間がかかっていました. そこでちょっと調べたところ, startswith()
でも文字列の一致の判定ができることに気付いたので, プログラムを修正してみました.
コード
文字列の一致の判定で, 前回は re.match()
を使っていました. コードは以下の通りです.
2-1
def check_match(s_list, query):
"""文字列のリスト (s_list) とクエリー (query) を受け取り, マッチしたリストのインデックスを返す
"""
match_list = list(map(lambda x: re.match(query, x), s_list)) # マッチしたかしないかのリストを返す
return [i for i, x in enumerate(match_list) if x != None] # マッチしたリストのインデックスを返す
この関数を, startswith()
を使って書き換えます. startswith()
は True
か False
を返すので, return
の内包表記も書き換えてます.
2-1'
def check_match(s_list, query):
"""文字列のリスト (s_list) とクエリー (query) を受け取り, マッチしたリストのインデックスを返す
"""
match_list = list(map(lambda x: x.startswith(query), s_list)) # マッチしたかしないかのリストを返す
return [i for i, x in enumerate(match_list) if x == True] # マッチしたリストのインデックスを返す
実行時間比較
文字列の一致判定による実行時間の違いは, 次の通りでした (単位 ; 秒). startswith()
のほうが早いですね.
テスト番号 | re.match() |
startswith() |
---|---|---|
1 | 0.04 | 0.03 |
2 | 0.03 | 0.02 |
3 | 0.24 | 0.09 |
4 | 0.06 | 0.04 |
5 | 0.16 | 0.06 |
6 | 0.32 | 0.11 |
7-1 | 0.09 | 0.04 |
7-2 | 0.08 | 0.04 |
8 | 0.26 | 0.09 |
9 | 1.49 | 0.45 |
10 | 1.58 | 0.49 |
さいごに
「文字列の一致は正規表現だろう」と思ってましたが startswith()
や endswith()
, また含まれるかどうかは in
で分かります. 適材適所が大事ですね.