質問編集履歴

2 題名変更

zeitaku_fire

zeitaku_fire score 18

2018/06/29 19:55  投稿

```python
num = [i for i in map(int,input().split(" "))] #入力データの一行目取り出し [7, 3]
date=[]
uryo=[]
for i in range(num[0]): #7回繰り返し
dater=[i for i in map(int,input().split(" "))] #入力データをリストとして取り出し
date.append(dater[0])
uryo.append(dater[1])
player_ans = {}
for h, p in zip(date, uryo): #取り出した入力データをリストに格納
player_ans[h] = p
#上記6行に渡って、「入力データ取り出し ⇒ リスト ⇒辞書」としています。
#下記の1行でできると思ったのですが、上手く動かなかったので、やむを得ず上記のコードとしています。
#player_ans = {date:uryo for date,uryo in input().split(" ")} 動かない
print(player_ans) #{1: 0, 2: 20, 3: 10, 4: 80, 5: 10, 6: 0, 7: 10}
#入力データ
7 3 #7は下記入力データの数を表している。 3は連続する回数を表している。 ※詳しくは下記に。
1 0
2 20
3 10
4 80
5 10
6 0
7 10
#希望する出力 5
```
『やりたいこと』
・入力データの2行目(1,0)からを対象に、右の数字(今回の場合は3個単位 ※最初の入力データの**3**をみる)を合計。
 最も低い合計の行を出力したい。
 今回の入力データの場合、まず
 1 0
 2 20
 3 10
 これらの右の数を合計(30)
 次に
 2 20
 3 10
 4 80
 これらの右の数を合計(110)
 3 10
 4 80
 5 10
 これらの右の数を合計(100)
 と、最後までみていき、
 合計が最も低い行を出力したい。
 今回の入力データでは、
 5 10
 6 0
 7 10
 が、合計20となるため、この合計値の先頭(**5**)を出力
・**3個単位で合計を見る必要がある**ため、例えば先頭の(1,0)が最小(値0)ということで出力するのはNG
 最後の(6,0 7,10)が最小(値10)ということで出力するのもNG(2行しかみていないため)
『考えたこと』
・辞書型にして、行をkeyに、値をvalueに、値を3個単位で合計して最小値を求めるのが楽かと思ったんですが、
 どのようなコードで計算すればいいかつまづいてしまいました。
 ※載せているコードは、入力データを辞書化しただけです。
『ご質問』
・辞書型で解く方法、もしくは別なやり方がありましたら、ご教授いただきたいです。
・今回、入力データをリスト化して、辞書型としていますが、
 もっと楽に辞書型にできるようでしたら、こちらもご教授いただきたいです。 
ここまで長くなってごめんなさい。
よろしくお願いします。
  • Python 3.x

    9851 questions

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

1 無駄な()削除

zeitaku_fire

zeitaku_fire score 18

2018/06/29 19:54  投稿

python 辞書 値 ○個単位で最小値の合計を求める
```python
num = [i for i in map(int,input().split(" "))] #入力データの一行目取り出し [7, 3]
date=[]
uryo=[]
for i in range(num[0]): #7回繰り返し
   dater=([i for i in map(int,input().split(" "))]) #入力データをリストとして取り出し
   dater=[i for i in map(int,input().split(" "))] #入力データをリストとして取り出し
   date.append(dater[0])
   uryo.append(dater[1])
   player_ans = {}
   for h, p in zip(date, uryo): #取り出した入力データをリストに格納
       player_ans[h] = p
#上記6行に渡って、「入力データ取り出し ⇒ リスト ⇒辞書」としています。
#下記の1行でできると思ったのですが、上手く動かなかったので、やむを得ず上記のコードとしています。
#player_ans = {date:uryo for date,uryo in input().split(" ")} 動かない
print(player_ans) #{1: 0, 2: 20, 3: 10, 4: 80, 5: 10, 6: 0, 7: 10}
#入力データ
7 3 #7は下記入力データの数を表している。 3は連続する回数を表している。 ※詳しくは下記に。
1 0
2 20
3 10
4 80
5 10
6 0
7 10
#希望する出力 5
```
『やりたいこと』
・入力データの2行目(1,0)からを対象に、右の数字(今回の場合は3個単位 ※最初の入力データの**3**をみる)を合計。
 最も低い合計の行を出力したい。
 今回の入力データの場合、まず
 1 0
 2 20
 3 10
 これらの右の数を合計(30)
 次に
 2 20
 3 10
 4 80
 これらの右の数を合計(110)
 3 10
 4 80
 5 10
 これらの右の数を合計(100)
 と、最後までみていき、
 合計が最も低い行を出力したい。
 今回の入力データでは、
 5 10
 6 0
 7 10
 が、合計20となるため、この合計値の先頭(**5**)を出力
・**3個単位で合計を見る必要がある**ため、例えば先頭の(1,0)が最小(値0)ということで出力するのはNG
 最後の(6,0 7,10)が最小(値10)ということで出力するのもNG(2行しかみていないため)
『考えたこと』
・辞書型にして、行をkeyに、値をvalueに、値を3個単位で合計して最小値を求めるのが楽かと思ったんですが、
 どのようなコードで計算すればいいかつまづいてしまいました。
 ※載せているコードは、入力データを辞書化しただけです。
『ご質問』
・辞書型で解く方法、もしくは別なやり方がありましたら、ご教授いただきたいです。
・今回、入力データをリスト化して、辞書型としていますが、
 もっと楽に辞書型にできるようでしたら、こちらもご教授いただきたいです。 
ここまで長くなってごめんなさい。
よろしくお願いします。
  • Python 3.x

    9851 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る