回答編集履歴

3

追記

2018/06/30 04:37

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -135,3 +135,191 @@
135
135
 
136
136
 
137
137
  [Wandbox](https://wandbox.org/permlink/TxopW8SeqDztgdHd)
138
+
139
+
140
+
141
+ コメントを受けて
142
+
143
+ ---
144
+
145
+ > enumerateなんですが、for文の際に使うもので、リストのインデックスをとるときに使用するものだと認識しておりますが、for文がありません。
146
+
147
+ ここでのenumerateは何をしているのでしょうか。。?
148
+
149
+ > また、groupsは上記でタプルにされているデータをさしているのはわかるのですが、stard=1は何なのでしょうか?
150
+
151
+
152
+
153
+ for文で良く用いられるのは確かですが、その実態はジェネレータを返しているだけなのです。
154
+
155
+ また、キーワード引数startは、どの数値から順に付与するかを示します。
156
+
157
+ ```Python
158
+
159
+ >>> abc = list('abcdefg')
160
+
161
+ >>> abc
162
+
163
+ ['a', 'b', 'c', 'd', 'e', 'f', 'g']
164
+
165
+ >>>
166
+
167
+ >>> enumerate(abc)
168
+
169
+ <enumerate object at 0x00000270D21ED438>
170
+
171
+ >>>
172
+
173
+ >>> list(enumerate(abc))
174
+
175
+ [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f'), (6, 'g')]
176
+
177
+ >>>
178
+
179
+ >>> list(enumerate(abc, start=5))
180
+
181
+ [(5, 'a'), (6, 'b'), (7, 'c'), (8, 'd'), (9, 'e'), (10, 'f'), (11, 'g')]
182
+
183
+ ```
184
+
185
+
186
+
187
+ ---
188
+
189
+ > key=lambda ig: sum(ig[-1])
190
+
191
+ lambdaは、引数、:の後に処理を記述すると認識しております。
192
+
193
+ min(enumerate(groups, start=1)この処理結果がigにはいって、sumして、keyに入って、それをindexと_に戻り値として渡される?という認識でよろしいでしょうか?
194
+
195
+
196
+
197
+ enumerate(groups, start=1)が返した各要素がigに入ります。
198
+
199
+ 例えば一回目は`(1, (0, 20, 10))`が、二回目は`(2, (20, 10, 80))`がigに与えられるわけです。
200
+
201
+
202
+
203
+ keyは関数が『何をもって要素を比べるか』指定するために使います。
204
+
205
+ 今回は`sum(ig[-1])`、つまり件の三個組の要素の合計を指標にしています。
206
+
207
+
208
+
209
+ **minした結果をラムダで処理しているのではなく、minを求めるのにラムダを用いています。**
210
+
211
+ minがどんな処理をしているか覗いてみたら、少しイメージが湧くかもしれません。
212
+
213
+ ```Python
214
+
215
+ def my_min(it, key=None):
216
+
217
+ print('-' * 42)
218
+
219
+ if key is None:
220
+
221
+ key = lambda x: x # 恒等関数
222
+
223
+
224
+
225
+ ret = next(it)
226
+
227
+ ret_score = key(ret)
228
+
229
+
230
+
231
+ for e in it:
232
+
233
+ e_score = key(e)
234
+
235
+ print(f'{ret}[score={ret_score}] vs {e}[score={e_score}]', end='\t')
236
+
237
+
238
+
239
+ if ret_score > e_score:
240
+
241
+ print('latter wins')
242
+
243
+ ret, ret_score = e, e_score
244
+
245
+ else:
246
+
247
+ print('former wins')
248
+
249
+
250
+
251
+ print(f'smallest element is {ret}')
252
+
253
+ print('-' * 42)
254
+
255
+ return ret
256
+
257
+ ```
258
+
259
+
260
+
261
+ **実行結果** (minの代わりにmy_minを使用) [Wandbox](https://wandbox.org/permlink/nofae6dKyQAcRCXS)
262
+
263
+ ```plain
264
+
265
+ ------------------------------------------
266
+
267
+ (1, (0, 20, 10))[score=30] vs (2, (20, 10, 80))[score=110] former wins
268
+
269
+ (1, (0, 20, 10))[score=30] vs (3, (10, 80, 10))[score=100] former wins
270
+
271
+ (1, (0, 20, 10))[score=30] vs (4, (80, 10, 0))[score=90] former wins
272
+
273
+ (1, (0, 20, 10))[score=30] vs (5, (10, 0, 10))[score=20] latter wins
274
+
275
+ smallest element is (5, (10, 0, 10))
276
+
277
+ ------------------------------------------
278
+
279
+ 5
280
+
281
+ ```
282
+
283
+
284
+
285
+ **註:** 説明のために書いたコードであり、実際のminの実装を踏襲したものではありません。
286
+
287
+
288
+
289
+ ---
290
+
291
+ > 前半部分「sorted(sum_dict.items()」は、辞書をソートされている。ここまではわかるのですが、
292
+
293
+ やはり、lambdaの処理が完璧に理解できません。(ソートした辞書をitemに渡す?)
294
+
295
+
296
+
297
+ 辞書の各要素をタプルにしたシーケンスを作り、そいつをソートしています。
298
+
299
+ **ソートした結果をラムダで処理しているのではなく、ソートするのにラムダを用いています。**
300
+
301
+ ```Python
302
+
303
+ >>> tmp_dict = {i: i**2 for i in range(10)}
304
+
305
+ >>> tmp_dict
306
+
307
+ {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
308
+
309
+ >>>
310
+
311
+ >>> tmp_dict.items()
312
+
313
+ dict_items([(0, 0), (1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9, 81)])
314
+
315
+ ```
316
+
317
+
318
+
319
+ ---
320
+
321
+ > 回答いただいたのに、それに対しての質問ばかりでごめんなさい。
322
+
323
+
324
+
325
+ いえいえ、お気遣いなく。

2

追記

2018/06/30 04:37

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -52,6 +52,46 @@
52
52
 
53
53
 
54
54
 
55
+ ---
56
+
57
+ hayataka2049さんのご指摘を受けて修正したバージョン。
58
+
59
+ ```Python
60
+
61
+ n, span = map(int, input().split())
62
+
63
+
64
+
65
+ nums = [
66
+
67
+ int(input().split()[-1]) for _ in range(n)
68
+
69
+ ]
70
+
71
+
72
+
73
+ groups = zip(*[nums[s:] for s in range(span)])
74
+
75
+ index, _ = min(
76
+
77
+ enumerate(groups, start=1),
78
+
79
+ key=lambda ig: sum(ig[-1]) # (index, num_group)
80
+
81
+ )
82
+
83
+
84
+
85
+ print(index)
86
+
87
+ ```
88
+
89
+
90
+
91
+ [Wandbox](https://wandbox.org/permlink/1nzQntpOahKrbzns)
92
+
93
+
94
+
55
95
  せっかくなので
56
96
 
57
97
  ---

1

追記

2018/06/29 12:00

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -49,3 +49,49 @@
49
49
 
50
50
 
51
51
  [Wandbox](https://wandbox.org/permlink/FtTATIMNeMWGuNMJ)
52
+
53
+
54
+
55
+ せっかくなので
56
+
57
+ ---
58
+
59
+ 辞書を使った方法も書いてみた。
60
+
61
+ ```Python
62
+
63
+ n, span = map(int, input().split())
64
+
65
+
66
+
67
+ nums = [
68
+
69
+ int(input().split()[-1]) for _ in range(n)
70
+
71
+ ]
72
+
73
+
74
+
75
+ sum_dict = {
76
+
77
+ i: 0 for i in range(n-span+1)
78
+
79
+ }
80
+
81
+ for key in sum_dict:
82
+
83
+ for i in range(span):
84
+
85
+ sum_dict[key] += nums[key+i]
86
+
87
+
88
+
89
+ index = sorted(sum_dict.items(), key=lambda item: item[-1])[0][0]
90
+
91
+ print(index+1)
92
+
93
+ ```
94
+
95
+
96
+
97
+ [Wandbox](https://wandbox.org/permlink/TxopW8SeqDztgdHd)