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

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

ただいまの
回答率

90.81%

  • Python 3.x

    4503questions

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

Python3 二重リスト 特定の要素比較 ループ 新しいリストの作成

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 138

問題)

あなたは連休の内 N 日間のジムにいく計画を立てています。

できる限り、ジムが空いているN日間のみ利用したいです。

ジムの混雑の割合表をみて、 N 日間の混雑割合の平均が最も低くなる日程を選びます。

入力値

連休の日数、 旅行にいくN日間
日付 割合

が与えられる。

入力例1
7 3
19 0
20 0
21 60
22 30
23 10
24 10
25 90
出力例1
22 24

入力例2
10 4
3 30
4 25
5 20
6 65
7 75
8 0
9 10
10 100
11 35
12 80
出力例2
3 6

自分のコード

以下のコードで出力値を求められました。

一人よがりの作業で満足する前に、ほかの方からの率直なアドバイスを頂きたいです。

見づらい、わかりやすいなんでも構いません。

ご意見頂けたら幸いです。

コード

a,b = map(int, input().split())
c = a-b+1

data = [ list(map(int, input().split())) for x in range(a)]

lst_ratio = []
for i in range(a):
    lst_ratio.append(data[i][1])

lst_ratio_trans = []
for x in range(c):
    lst_ratio_trans.append(lst_ratio[x:b+x])


lst_days = []
for i in range(a):
    lst_days.append(data[i][0])

lst_days_trans = []
for x in range(c):
    lst_days_trans.append(lst_days[x:b+x])


ratio_sum_lst = []
for x in lst_ratio_trans:
    ratio_sum_lst.append(sum(x))

min_ratio = min(ratio_sum_lst)
for x in range(c):
    if ratio_sum_lst[x] == min_ratio:
        ans = x
    else:pass


print(lst_days_trans[ans][0],lst_days_trans[ans][-1])
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2018/05/07 22:39

    『それぞれの値は文字列で標準入力から渡されます。標準入力からの値取得方法はこちらをご確認ください』paizaのフレーズに見えます。

    キャンセル

  • SatoshiMashino

    2018/05/07 22:42

    補足すると、Paizaの問題は外に出さないように、という取り決めがありますので、もしこの問題がPaizaのものであるなら取り下げた方がよろしいかと思います。

    キャンセル

  • YouheiSakurai

    2018/05/07 23:05

    前々回同様に読みにくいです。コードを読みやすく変更してください。

    キャンセル

  • LouiS0616

    2018/05/08 10:28

    問題文を書き換えれば良いというものでもないのですが... 出典を明記してください。

    キャンセル

回答 3

checkベストアンサー

0

とりあえずPEP8に準拠したらどうですか? チェックツールに入れたら普通に指摘が出てくるんですが・・・

PEP8 online check

そういう段階で「見づらい」「分かりづらい」の議論もないと思います。

ついでに言えば、どんな考え方で書いたのか説明するとか、何をやっているのかコメント入れるとかするのが適当な気がします。アドバイスしてほしいという立場で質問するなら、せめてそれくらいは心がけないとみんな困るでしょう。

あと、指摘が上がってる件にちゃんと対応してください。


一応私が書いたのも貼っておきましょう。

holiday_n, gym_n = map(int, input().split())

data = [[int(x) for x in input().split()]  # 内包にしているのは趣味の問題
        for _ in range(holiday_n)]

days, gym_crowd_rates = zip(*data)  # 日付のリストと混雑率のリストにデータを変換する

loop_n = holiday_n - gym_n + 1  # ループ回数の計算
d = {}  # 楽するために辞書に入れることにする
for i in range(loop_n):  # いわゆるn-gram的なもの(期間を1日ずつ動かしながら処理していく)
    period = tuple(days[i:i+gym_n])  # 辞書のキーにするためにタプルに変換
    crowd_mean = sum(gym_crowd_rates[i:i+gym_n])/gym_n  # 混雑率の平均を求める
    d[period] = crowd_mean

min_days, min_crowd_mean = min(d.items(), key=lambda x: x[1])  # 混雑率の平均をキーにしてmin
print(min_days[0], min_days[-1])

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

パッと見読みにくく見える原因は以下の3点のように思います

素直なアルゴリズムでない

この問を手を動かして自分で考えるとき、場合の数とか考えないと思います
大抵の場合、頭で考えたことをそのままプログラムしたほうが読みやすいです

制御構文が多い

好みの問題かもしれませんが、制御構文が多いと読む気がなくなります
forとかifとかなるべく使わないで済む書き方を考えたほうがいいかもしれません
特にif文は値を切り替えるだけであれば、三項演算子を使ったほうが個人的にはいいと思います
(三項演算子は賛否あるようですが)

処理が長い

pythonは1関数15~20行程度にしろとどこかの偉い人が言っていた気がします。
長い処理は適切な単位で関数化したほうが読みやすくなるかも..

その他の細かいところはそのうち自然と身につくと思います
参考までに僕の書いたコードをコピペしておきます
偉そうなこと言っといて汚いと思われたら恥ずかしいですが...

#!/usr/bin/env python

def main():
    #ここパクリました
    holiday_length, trip_length = map(int, input().split())
    congestion_rate = [list(map(int, input().split())) for x in range(holiday_length)]

    min_start_date = 0
    min_congestion_rate = 100 * len(congestion_rate) + 1
    for departure_index in range(holiday_length):
        if departure_index + trip_length > holiday_length:
            break
        cur_congestion_rate = 0
        for index in range(trip_length):
            cur_congestion_rate += congestion_rate[departure_index + index][1]
        is_update = True if min_congestion_rate > cur_congestion_rate else False
        min_congestion_rate = cur_congestion_rate if is_update else min_congestion_rate 
        min_start_date = congestion_rate[departure_index][0] if is_update else min_start_date 
    print(min_start_date, min_start_date + trip_length - 1)

if __name__ == "__main__":
    main()

functiontoolsとか使っていいのであれば、reduceとか使うといいかも

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

計算旅行に行く日数を範囲に混雑割合の移動平均を計算することがコードのキモだとすると、入力値をDataframeに変換して、rollingメソッドを使って移動平均を計算するという方法もあります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 受付中

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

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

  • 解決済

    python3 入力

    python3にて 12 234 567 89 1234 ... ... 345 のように 行数指定のない任意の行数の入力を a[0]=12 a[1]=234 a[3]=5

  • 解決済

    python3 の入力とEOFについて

    前提・実現したいこと ここに質問したいことを詳細に書いてください (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが発生し

  • 解決済

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

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

  • 解決済

    pythonで標準入力系で分からない事があります

    入力例1で言うとprint(c_1)とすると1  6 となるようにしたい更にprint(c_1[1])とすると 1 となるようにしたい 入力例1 2 20 5 10 45 6

  • 解決済

    Python3 リストの中にあるリスト 要素抽出方法

    目標) 筋トレの記録をまとめるアプリをつくりたい 一回の筋トレで 胸、背中、脚、腕の4種目を行う それぞれの扱ったダンベルの重さを記入してもらう 一回分の記録例) ch

  • 解決済

    Python3 リストの中のリスト 要素追加、

    目標) 筋トレの記録をまとめるアプリをつくりたい 一回の筋トレで 胸、背中、脚、腕の4種目を行う それぞれの扱ったダンベルの重さを記入してもらう 一回分の記録例) ch

  • 解決済

    Python3  ある整数を一定の割合ずつ減額する 繰り返し処理 while

    目標) 筋トレメニュー作成アプリをつくりたい。 ベンチプレスを何回あげるかを自動で決めてくれる機能が欲しい。 1回目はX回あげる、二回目以降は前回の挙げた回数のP%下げ

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

  • Python 3.x

    4503questions

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