質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

1900閲覧

もっと簡潔に書きたいpython3<no.2>

hmori

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2018/05/30 02:59

簡潔にもっと綺麗に作りたい
よろしければご指導してください

python3 で最近プログラミングを勉強しています

下記の問題を問いて解答はできているのですが
まとまりが悪く美しくないコードになってしまいました
よろしければご指導ください

英語、数学、理科、国語、地理歴史の 5 科目で各 100 点満点
全科目の合計得点が 350 点以上で
理系 2 科目 数学、理科 の合計得点が 160 点以上
文系 2 科目 国語、地理歴史 の合計得点が 160 点以上
受験者それぞれの各科目の点数が入力されるので、何人足切りを通過できるかを求めてください。
sは理系 lは文系を表しています

受験者数(n)人
英語 数学 理科 国語 地理歴史     
理系(s) 70 78 82 57 74      
文系(l) 68 81 81 60 78
理系(s) 63 76 55 80 75
理系(s) 90 100  96 10 10
文系(l) 88 78 81 97 93

----上のフォーマットを入力例で表すと下記のようになります-----
入力例
5
s 70 78 82 57 74
l 68 81 81 60 78
s 63 76 55 80 75
s 90 100 96 10 10
l 88 78 81 97 93

出力例
2

python3

1n = int(input()) 2 3record =[] 4 5for i in range(n): 6 tmp = input().split() 7 for b in range(len(tmp)): 8 try: 9 tmp[b] = int(tmp[b]) 10 except: 11 pass 12 record.append(tmp) 13 14cnt = 0 15 16for i in record: 17 ans = i[1]+i[2]+i[3]+i[4]+i[5] 18 if ans >= 350: 19 if (i[0] == 'l') and (i[4]+i[5] >= 160): 20 cnt = cnt + 1 21 elif (i[0] == 's') and (i[2]+i[3] >= 160): 22 cnt = cnt + 1 23 24print(cnt) 25コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ぱっと気が付いた点としては:
0. まず、最初に行数をユーザーに入力させるという仕様がカッコよくない。
0. 次に、入力部と成績評価を別々のループにする意義が薄い。
0. i[1],i[2]などという書き方が判りにくい。

一点目、入力が空であることをもって入力終了という約束事にしておけば、最初のforはwhileで書き直せます。ユーザにいちいちデータ数(生徒数)を確認させる(そして御入力の余地を与える)必要はないでしょう。

二点目、成績評価は一行のデータから可能なので、入力した端から通過・不通過を判定できます。つまり二番目のforループの中に書いてある計算処理は、for b ... の下に持ってくることができます。recordに全生徒分のデータを貯めおく必要はなく、その分メモリの節約が図れます。必要なら、合格者数・日合格者数を記録するカウンタ用変数を別に用意してもいいでしょう。

3点目、このiは(名前も問題ですが)辞書とする方がが判りやすくなるのではないでしょうか。合計値はsum(i.values())のようにして得られます。

投稿2018/05/30 04:35

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hmori

2018/05/30 17:25

ご回答ありがとうございます 辞書の使い方については勉強中で、少しずつ使っていけたらと思います 計算処理を上のほうにまとめることができたらすっきりしますね ありがとうございます 最初に行数というのは出題者がこういう仕様で出題してきていたので 申し訳ないです 大変参考になりました 少しずつ綺麗にまとまるようにかければと 思います
guest

0

ベストアンサー

なるべく構成をいじらずに以下の点を変更してみました。

  • for b in ...のところ、b=1からスタートするようにして例外処理を省略
  • 5科目の合計計算はsum()に
  • i[2] などを i[科目名] に

python

1n = int(input()) 2 3records =[] 4 5for r in range(n): 6 tmp = input().split() 7 for b in range(1, len(tmp)): 8 tmp[b] = int(tmp[b]) 9 records.append(tmp) 10 11cnt = 0 12 13EIGO, SUUGAKU, RIKA, KOKUGO, CHIRI_REKISHI = 1, 2, 3, 4, 5 14for r in records: 15 ans = sum(r[1:]) 16 if ans >= 350: 17 if (r[0] == 'l') and (r[KOKUGO] + r[CHIRI_REKISHI] >= 160): 18 cnt += 1 19 elif (r[0] == 's') and (r[SUUGAKU] + r[RIKA] >= 160): 20 cnt += 1 21 22print(cnt)

構成を大きく変更しても良いのであれば、

  • 足切り判定の部分は is_qualified() など別関数にする
  • 入力データを sl, *scores = input().split() のように受けて、文理区分と得点を別変数で管理する

のような感じはどうでしょうか。

python

1def solve(): 2 qualified = 0 3 n = int(input()) 4 for _ in range(n): 5 sl, *scores = input().split() 6 if is_qualified(sl, [int(x) for x in scores]): 7 qualified += 1 8 print(qualified)

投稿2018/05/30 04:52

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hmori

2018/05/30 19:28

ご回答ありがとうございます 構成をいじらずに助かります 構成を大きく変更したほうは、もう少し勉強してみます 大変参考になりました
guest

0

こんな感じでしょうか。
input の段階で理系・文系のレコードをわけておき、
後半の足切計算を抽象化しています。

python

1records = [[], []] # [records of s, records of l] 2 3# input records 4n = int(input()) 5for i in range(n): 6 tmp = input().split() 7# records[tmp[0] == "l"].append([int(t) for t in tmp[1:]]) 8 records[1 if tmp[0] == "l" else 0].append([int(t) for t in tmp[1:]]) 9 10# calc ashikiri 11cnt = 0 12for record, n in zip(records, [1, 3]): 13 for r in record: 14 if sum(r) >= 350 and sum(r[n:n+2]) >= 160: 15 cnt += 1 16 17print(cnt)

投稿2018/05/30 04:55

DanDan244

総合スコア57

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hmori

2018/05/31 00:09

ご回答ありがとうございました 参考にさせていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問