Python初級 - 文字列 - 文字列の演習問題 timetable_2.pyの解説¶
文字列の演習問題 2問目の解説です。
関数count_subjectsの内部を解説します。
辞書s_countに最終的にキーに各科目名、値に科目が何回実施されるかを入れることになります。
最初の辞書 s_count→{}
1for col in columns:
2 if col != day:
3 if col in s_count.keys(): ←
4 s_count[col] += 1
5 else:
6 s_count[col] = 1
この部分で1行目を処理した場合の動き
columns→ ['月曜日','国語','算数','社会','体育','体育']
1周目:
col→ '月曜日'
、 day→'月曜日'
なので、if col != day:
が成り立たないので2周目へ
2周目: col→'国語'
、 s_count→{}
、 s_count.keys()→[]
if col in s_count.keys():
が成り立たないので、 else
の方の処理
s_count['国語'] = 1
となり、 s_count→{'国語': 1}
3周目: col→'算数'
、 s_count→{'国語': 1}
、 s_count.keys()→['国語']
if col in s_count.keys():
が成り立たないので、 else
の方の処理
s_count['算数'] = 1
となり、 s_count→{'国語': 1, '算数': 1}
飛んで、
6周目: col→'体育'
、 s_count→{'国語': 1, '算数': 1, '社会': 1, '体育':1}
、 s_count.keys()→['国語','算数','社会','体育']
if col in s_count.keys():
が成り立つので、
s_count[col] += 1
が実行されます。
これは、すでに辞書count内にある'体育'の値を1増加させる処理です。
s_count['体育'] += 1
これがファイルの月曜日の行の処理になります。
全体の解説になります。以下の回答では、各行の先頭の曜日を省くところを文字列のスライスを利用しています。
1def count_subjects():
2 """各教科が週に何回実施されるかカウントする."""
3 # 集計結果保存用に空の辞書を作成
4 s_count={}
5 # ファイルを開く
6 with open('input/timetable.csv',encoding='utf-8' ) as f:
7 # ファイルの1行ずつ処理をする
8 for row in f:
9 # 1行の文字列を左右の改行、空白などを削除(rstrip)し、
10 # カンマで区切られている要素をリストにする
11 # 1行名は「月曜日,国語,算数,社会,体育,体育」なので、以下のようなリストになる
12 # ['月曜日', '国語', '算数', '社会', '体育', '体育']
13 columns=row.rstrip().split(',')
14 # 作成したリストの2番めの要素以降を変数colに代入して処理する
15 # これは、1つ目の要素が曜日情報なので除外するためです。
16 for col in columns[1:]:
17 # 1行目だと1周目は col = '国語'である。
18 if col in s_count.keys():
19 # 辞書s_countにキーが存在している場合は値をプラス1
20 s_count[col]+=1
21 else:
22 # 辞書s_countにキーが存在していない場合は値に1を指定する
23 s_count[col]=1
24 # 集計した辞書を返す
25 return s_count
26
27def main():
28 """メインの処理."""
29 # 変数resには集計結果の辞書が代入される
30 res = count_subjects()
31
32 # 辞書のキーと値を変数k, v代入し、表示に利用
33 for k, v in res.items():
34 print('{}は{}回'.format(k,v))
35
36
37if __name__ == '__main__':
38 main()