ログのレベルと単語の集計

  • 文字列の処理
  • 問題 05
  • やさしい
  • 目安 11 分

サーバーのログを 1 行ずつ空白で分け、レベルごとの件数と、調べたい単語がいくつの行に出てくるかを出す。文字列を分けて数え、辞書で引く練習です。

本番の試験は PC で受けることが多いので、PC での練習をすすめます。スマホでも、読んで、書いて、採点するところまで動きます。

入力は標準入力から読み、答えは標準出力に書きます。1 テストあたり 3 秒までです。

問題

あるサーバーのログが N 行あります。1 行は、時刻、レベル、メッセージを空白 1 つで区切って並べたものです。

  • 時刻は 09:05:30 のように、時、分、秒を 2 桁ずつ並べた 8 文字です
  • レベルは ERROR、WARN、INFO、DEBUG のどれかです
  • メッセージは、英小文字だけの単語が 1 個以上、空白 1 つで区切られて並んだものです

ログのあとに、調べたい単語が Q 個与えられます。次の 2 つを出力してください。

  1. レベルごとの行の数。ERROR、WARN、INFO、DEBUG の順に、1 行に 1 つずつ、レベルの名前と行の数を空白 1 つで区切って書きます。1 行も無いレベルも 0 と書きます
  2. 調べたい単語のそれぞれについて、その単語をメッセージの単語として含む行の数。与えられた順に 1 行ずつ書きます

単語を含むかどうかは、メッセージを空白で分けた単語のどれかと完全に一致するかで決めます。login は relogin の一部ですが、relogin という単語しか無い行は login を含みません。1 つの行に同じ単語が 2 回出てきても、その行は 1 行と数えます。時刻とレベルは単語に入れません。

入力の形式

N
時刻 レベル 単語 単語 ...
...
Q
w_1
w_2
...
w_Q

1 行目にログの行の数 N、続く N 行にログ、その次の行に調べたい単語の数 Q、続く Q 行に 1 行に 1 つずつ調べたい単語 w_i が並びます。

出力の形式

4 + Q 行を出力します。はじめの 4 行がレベルごとの行の数、続く Q 行が、調べたい単語ごとの、その単語を含む行の数です。

制約

  • N と Q は、どちらも 1 以上 100000 以下の整数です
  • 1 行のメッセージの単語は 1 個以上 5 個以下です
  • メッセージの単語と調べたい単語は、どれも英小文字 1 文字以上 10 文字以下です
  • 時刻は 00 時 00 分 00 秒から 23 時 59 分 59 秒までで、行は時刻の順に並んでいます

入力と出力の例

例 1

`ERROR` が 2 行、`WARN` が 1 行、`INFO` が 2 行、`DEBUG` は 0 行です。`login` を含む行は 1 行目と 3 行目の 2 行で、`relogin` しか無い 5 行目は数えません。`db` は 2 行目と 4 行目の 2 行、`timeout` は 2 行目だけです。`cache` はどの行にもありません。

入力

5
09:00:01 INFO user login ok
09:00:05 ERROR db timeout
09:01:10 INFO user login ok
09:02:00 WARN slow db query
09:03:30 ERROR relogin failed
4
login
db
timeout
cache

出力

ERROR 2
WARN 1
INFO 2
DEBUG 0
2
2
1
0

例 2

1 行に `retry` が 2 回出てきても、その行は 1 行と数えます。

入力

2
23:59:58 DEBUG retry retry retry
23:59:59 DEBUG done
2
retry
done

出力

ERROR 0
WARN 0
INFO 0
DEBUG 2
1
1

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

main.py
import sys

lines = sys.stdin.read().split("\n")
n = int(lines[0])
logs = [lines[1 + i].split() for i in range(n)]
q = int(lines[1 + n])
words = [lines[2 + n + i].strip() for i in range(q)]

# ここから書く
# logs[i] は i 行目を空白で分けた並びで、logs[i][0] が時刻、logs[i][1] がレベル、logs[i][2:] がメッセージの単語です

入力

出力

「実行する」を押すと、ここに出力が出ます

できているか「提出して採点」を押すと、隠れたテストを全部走らせて、通ったかをここに出します