質問するログイン新規登録

回答編集履歴

3

追記

2018/06/30 04:37

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -66,4 +66,98 @@
66
66
  print(index+1)
67
67
  ```
68
68
 
69
- [Wandbox](https://wandbox.org/permlink/TxopW8SeqDztgdHd)
69
+ [Wandbox](https://wandbox.org/permlink/TxopW8SeqDztgdHd)
70
+
71
+ コメントを受けて
72
+ ---
73
+ > enumerateなんですが、for文の際に使うもので、リストのインデックスをとるときに使用するものだと認識しておりますが、for文がありません。
74
+ ここでのenumerateは何をしているのでしょうか。。?
75
+ > また、groupsは上記でタプルにされているデータをさしているのはわかるのですが、stard=1は何なのでしょうか?
76
+
77
+ for文で良く用いられるのは確かですが、その実態はジェネレータを返しているだけなのです。
78
+ また、キーワード引数startは、どの数値から順に付与するかを示します。
79
+ ```Python
80
+ >>> abc = list('abcdefg')
81
+ >>> abc
82
+ ['a', 'b', 'c', 'd', 'e', 'f', 'g']
83
+ >>>
84
+ >>> enumerate(abc)
85
+ <enumerate object at 0x00000270D21ED438>
86
+ >>>
87
+ >>> list(enumerate(abc))
88
+ [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g')]
89
+ >>>
90
+ >>> list(enumerate(abc, start=5))
91
+ [(5, 'a'), (6, 'b'), (7, 'c'), (8, 'd'), (9, 'e'), (10, 'f'), (11, 'g')]
92
+ ```
93
+
94
+ ---
95
+ > key=lambda ig: sum(ig[-1])
96
+ lambdaは、引数、:の後に処理を記述すると認識しております。
97
+ min(enumerate(groups, start=1)この処理結果がigにはいって、sumして、keyに入って、それをindexと_に戻り値として渡される?という認識でよろしいでしょうか?
98
+
99
+ enumerate(groups, start=1)が返した各要素がigに入ります。
100
+ 例えば一回目は`(1, (0, 20, 10))`が、二回目は`(2, (20, 10, 80))`がigに与えられるわけです。
101
+
102
+ keyは関数が『何をもって要素を比べるか』指定するために使います。
103
+ 今回は`sum(ig[-1])`、つまり件の三個組の要素の合計を指標にしています。
104
+
105
+ **minした結果をラムダで処理しているのではなく、minを求めるのにラムダを用いています。**
106
+ minがどんな処理をしているか覗いてみたら、少しイメージが湧くかもしれません。
107
+ ```Python
108
+ def my_min(it, key=None):
109
+ print('-' * 42)
110
+ if key is None:
111
+ key = lambda x: x # 恒等関数
112
+
113
+ ret = next(it)
114
+ ret_score = key(ret)
115
+
116
+ for e in it:
117
+ e_score = key(e)
118
+ print(f'{ret}[score={ret_score}] vs {e}[score={e_score}]', end='\t')
119
+
120
+ if ret_score > e_score:
121
+ print('latter wins')
122
+ ret, ret_score = e, e_score
123
+ else:
124
+ print('former wins')
125
+
126
+ print(f'smallest element is {ret}')
127
+ print('-' * 42)
128
+ return ret
129
+ ```
130
+
131
+ **実行結果** (minの代わりにmy_minを使用) [Wandbox](https://wandbox.org/permlink/nofae6dKyQAcRCXS)
132
+ ```plain
133
+ ------------------------------------------
134
+ (1, (0, 20, 10))[score=30] vs (2, (20, 10, 80))[score=110] former wins
135
+ (1, (0, 20, 10))[score=30] vs (3, (10, 80, 10))[score=100] former wins
136
+ (1, (0, 20, 10))[score=30] vs (4, (80, 10, 0))[score=90] former wins
137
+ (1, (0, 20, 10))[score=30] vs (5, (10, 0, 10))[score=20] latter wins
138
+ smallest element is (5, (10, 0, 10))
139
+ ------------------------------------------
140
+ 5
141
+ ```
142
+
143
+ **註:** 説明のために書いたコードであり、実際のminの実装を踏襲したものではありません。
144
+
145
+ ---
146
+ > 前半部分「sorted(sum_dict.items()」は、辞書をソートされている。ここまではわかるのですが、
147
+ やはり、lambdaの処理が完璧に理解できません。(ソートした辞書をitemに渡す?)
148
+
149
+ 辞書の各要素をタプルにしたシーケンスを作り、そいつをソートしています。
150
+ **ソートした結果をラムダで処理しているのではなく、ソートするのにラムダを用いています。**
151
+ ```Python
152
+ >>> tmp_dict = {i: i**2 for i in range(10)}
153
+ >>> tmp_dict
154
+ {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
155
+ >>>
156
+ >>> tmp_dict.items()
157
+ dict_items([(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9, 81)])
158
+ ```
159
+
160
+ ---
161
+ > 回答いただいたのに、それに対しての質問ばかりでごめんなさい。
162
+
163
+ いえいえ、お気遣いなく。

2

追記

2018/06/30 04:37

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -25,6 +25,26 @@
25
25
 
26
26
  [Wandbox](https://wandbox.org/permlink/FtTATIMNeMWGuNMJ)
27
27
 
28
+ ---
29
+ hayataka2049さんのご指摘を受けて修正したバージョン。
30
+ ```Python
31
+ n, span = map(int, input().split())
32
+
33
+ nums = [
34
+ int(input().split()[-1]) for _ in range(n)
35
+ ]
36
+
37
+ groups = zip(*[nums[s:] for s in range(span)])
38
+ index, _ = min(
39
+ enumerate(groups, start=1),
40
+ key=lambda ig: sum(ig[-1]) # (index, num_group)
41
+ )
42
+
43
+ print(index)
44
+ ```
45
+
46
+ [Wandbox](https://wandbox.org/permlink/1nzQntpOahKrbzns)
47
+
28
48
  せっかくなので
29
49
  ---
30
50
  辞書を使った方法も書いてみた。

1

追記

2018/06/29 12:00

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -23,4 +23,27 @@
23
23
  print(indice[0])
24
24
  ```
25
25
 
26
- [Wandbox](https://wandbox.org/permlink/FtTATIMNeMWGuNMJ)
26
+ [Wandbox](https://wandbox.org/permlink/FtTATIMNeMWGuNMJ)
27
+
28
+ せっかくなので
29
+ ---
30
+ 辞書を使った方法も書いてみた。
31
+ ```Python
32
+ n, span = map(int, input().split())
33
+
34
+ nums = [
35
+ int(input().split()[-1]) for _ in range(n)
36
+ ]
37
+
38
+ sum_dict = {
39
+ i: 0 for i in range(n-span+1)
40
+ }
41
+ for key in sum_dict:
42
+ for i in range(span):
43
+ sum_dict[key] += nums[key+i]
44
+
45
+ index = sorted(sum_dict.items(), key=lambda item: item[-1])[0][0]
46
+ print(index+1)
47
+ ```
48
+
49
+ [Wandbox](https://wandbox.org/permlink/TxopW8SeqDztgdHd)