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

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

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

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

Q&A

解決済

3回答

2084閲覧

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

python3_beginer

総合スコア46

Python 3.x

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

0グッド

0クリップ

投稿2018/05/07 13:31

編集2018/05/07 23:53

問題)

あなたは連休の内 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])

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

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

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

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

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

LouiS0616

2018/05/07 13:39

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

2018/05/07 13:42

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

2018/05/07 14:05

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

2018/05/08 01:28

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

回答3

0

ベストアンサー

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

PEP8 online check

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

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

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


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

python

1holiday_n, gym_n = map(int, input().split()) 2 3data = [[int(x) for x in input().split()] # 内包にしているのは趣味の問題 4 for _ in range(holiday_n)] 5 6days, gym_crowd_rates = zip(*data) # 日付のリストと混雑率のリストにデータを変換する 7 8loop_n = holiday_n - gym_n + 1 # ループ回数の計算 9d = {} # 楽するために辞書に入れることにする 10for i in range(loop_n): # いわゆるn-gram的なもの(期間を1日ずつ動かしながら処理していく) 11 period = tuple(days[i:i+gym_n]) # 辞書のキーにするためにタプルに変換 12 crowd_mean = sum(gym_crowd_rates[i:i+gym_n])/gym_n # 混雑率の平均を求める 13 d[period] = crowd_mean 14 15min_days, min_crowd_mean = min(d.items(), key=lambda x: x[1]) # 混雑率の平均をキーにしてmin 16print(min_days[0], min_days[-1])

投稿2018/05/08 03:20

hayataka2049

総合スコア30933

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

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

0

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

投稿2018/05/08 01:58

R.Shigemori

総合スコア3376

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

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

0

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

####素直なアルゴリズムでない
この問を手を動かして自分で考えるとき、場合の数とか考えないと思います
大抵の場合、頭で考えたことをそのままプログラムしたほうが読みやすいです
####制御構文が多い
好みの問題かもしれませんが、制御構文が多いと読む気がなくなります
forとかifとかなるべく使わないで済む書き方を考えたほうがいいかもしれません
特にif文は値を切り替えるだけであれば、三項演算子を使ったほうが個人的にはいいと思います
(三項演算子は賛否あるようですが)
####処理が長い
pythonは1関数15~20行程度にしろとどこかの偉い人が言っていた気がします。
長い処理は適切な単位で関数化したほうが読みやすくなるかも..

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

python

1#!/usr/bin/env python 2 3def main(): 4 #ここパクリました 5 holiday_length, trip_length = map(int, input().split()) 6 congestion_rate = [list(map(int, input().split())) for x in range(holiday_length)] 7 8 min_start_date = 0 9 min_congestion_rate = 100 * len(congestion_rate) + 1 10 for departure_index in range(holiday_length): 11 if departure_index + trip_length > holiday_length: 12 break 13 cur_congestion_rate = 0 14 for index in range(trip_length): 15 cur_congestion_rate += congestion_rate[departure_index + index][1] 16 is_update = True if min_congestion_rate > cur_congestion_rate else False 17 min_congestion_rate = cur_congestion_rate if is_update else min_congestion_rate 18 min_start_date = congestion_rate[departure_index][0] if is_update else min_start_date 19 print(min_start_date, min_start_date + trip_length - 1) 20 21if __name__ == "__main__": 22 main() 23

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

投稿2018/05/07 15:57

Thrush

総合スコア58

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問