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

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

ただいまの
回答率

90.84%

  • Python 3.x

    4441questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 136

hmori

score 4

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

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

n = int(input())

record =[]

for i in range(n):
    tmp = input().split()
    for b in range(len(tmp)):
        try:
            tmp[b] = int(tmp[b])
        except:
            pass
    record.append(tmp)

cnt = 0

for i in record:
    ans = i[1]+i[2]+i[3]+i[4]+i[5]
    if ans >= 350:
        if  (i[0] == 'l') and (i[4]+i[5] >= 160):
            cnt = cnt + 1
        elif (i[0] == 's') and (i[2]+i[3] >= 160):
            cnt = cnt + 1

print(cnt)
コード
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

ぱっと気が付いた点としては:

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 02:25

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

    キャンセル

checkベストアンサー

+1

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

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

records =[]

for r in range(n):
    tmp = input().split()
    for b in range(1, len(tmp)):
        tmp[b] = int(tmp[b])
    records.append(tmp)

cnt = 0

EIGO, SUUGAKU, RIKA, KOKUGO, CHIRI_REKISHI = 1, 2, 3, 4, 5
for r in records:
    ans = sum(r[1:])
    if ans >= 350:
        if  (r[0] == 'l') and (r[KOKUGO] + r[CHIRI_REKISHI] >= 160):
            cnt += 1
        elif (r[0] == 's') and (r[SUUGAKU] + r[RIKA] >= 160):
            cnt += 1

print(cnt)

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 04:28

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

    キャンセル

0

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

records = [[], []]        # [records of s, records of l]

# input records
n = int(input())
for i in range(n):
    tmp = input().split()
#    records[tmp[0] == "l"].append([int(t) for t in tmp[1:]])
    records[1 if tmp[0] == "l" else 0].append([int(t) for t in tmp[1:]])

# calc ashikiri
cnt = 0
for record, n in zip(records, [1, 3]):
    for r in record:
        if sum(r) >= 350 and sum(r[n:n+2]) >= 160:
            cnt += 1

print(cnt)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/31 09:09

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

    キャンセル

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

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    ターミナルで実行するのに時間がかかりすぎる

    ターミナルで実行するのに時間がかかりすぎます。 画像圧縮のアルゴリズムを書いています。 N × N ピクセルのグレースケール画像があり各ピクセルの画素値は 0 から 255

  • 解決済

    outputがでず、困っています。

    下記の質問で、outputを出そうとするとエラーになってしまいます。解決方法をご存知でしょうか。 ifname=="main":の後に、エラーがでてきます。。 A user

  • 解決済

    文字列を比較して配列に格納できない

    ans配列の要素の文字列の最初の文字がlinesの要素の最初の文字と一致するならlinesの2番目の要素('A'/'B'/'C'/'D')をline_alpha配列に格納する、とい

  • 解決済

    競技プログラミングの問題(Python)_2

    下記のサイトの競技プログラミングの問題を解きました。 競技プログラミングの問題 簡単に説明すると、標準入力から2つの値(n,x)を受け取り、1~nから3つの値を取り出し総和がxとな

  • 解決済

    グラフの作り方がわかりません。

     前提・実現したいこと 以下のコードのグラフを作成したいのですが、求めたい値の最終値しかプロットされず作りたいグラフとは異なったものが出てきてしまいます。 2と5に収束していく2本

  • 解決済

    Python 3.x 辞書のキー値によって変換する場合の高速化

    Pythonにて、辞書(dict({key,value})を使って、list型の全要素をValue値に変換する際の、 高速化が可能かどうかをご教授いただきたいです。 dict1

  • 解決済

    Python3  データ収集 特定リストの要素の集計

    目標) 会社の中で、男女混合フットサルのグループをつくりたい。 ただし、一定のレベル以上のメンバーの特選グループをつくりたい そのため、体力テスト5科目を実施し、特選グループに入れ

  • 解決済

    辞書を小さいもの順にソートしたい

    辞書を小さいもの順にソートしたい。 df変数に {"A": [{"a": 100}, {"b": 200}, {"c": 300}], "B": [{"a": 400}, {"

同じタグがついた質問を見る

  • Python 3.x

    4441questions

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