回答編集履歴

5

途中で送信されてしまったので

2017/10/16 09:32

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
File without changes

4

修正

2017/10/16 09:32

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -234,7 +234,7 @@
234
234
 
235
235
  ```Python
236
236
 
237
- for key, value in date_dict:
237
+ for key in date_dict:
238
238
 
239
239
  if datetime.date(2011, 4, 1) <= key < datetime.date(2011, 4, 6):
240
240
 
@@ -248,6 +248,10 @@
248
248
 
249
249
 
250
250
 
251
+ こっちの書き方でも充分簡潔ですね。最初からこっちを書いた方が良かったかも。
252
+
253
+
254
+
251
255
  ---
252
256
 
253
257
  Teratailには、コードを上記のように見やすく表示する機能があります。

3

追記

2017/10/16 09:31

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -208,6 +208,46 @@
208
208
 
209
209
 
210
210
 
211
+ 結局なにをやっているのか?
212
+
213
+ ---
214
+
215
+ ```Python
216
+
217
+ # フィルター用の関数
218
+
219
+ def is_in_date_range(date):
220
+
221
+ return datetime.date(2011, 4, 1) <= date < datetime.date(2011, 4, 6)
222
+
223
+
224
+
225
+ # 上記関数に適合しない要素を取り除く
226
+
227
+ date_dict = dict(filter(lambda x: is_in_date_range(x[0]), date_dict.items()))
228
+
229
+ ```
230
+
231
+
232
+
233
+ 次のように書いても、結果は一緒です。
234
+
235
+ ```Python
236
+
237
+ for key, value in date_dict:
238
+
239
+ if datetime.date(2011, 4, 1) <= key < datetime.date(2011, 4, 6):
240
+
241
+ pass
242
+
243
+ else:
244
+
245
+ del date_dict[key]
246
+
247
+ ```
248
+
249
+
250
+
211
251
  ---
212
252
 
213
253
  Teratailには、コードを上記のように見やすく表示する機能があります。

2

追記

2017/10/16 09:23

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -184,6 +184,28 @@
184
184
 
185
185
  私のコードでは、ラムダ式と関数とを組み合わせる形でフィルタリングを実現しています。
186
186
 
187
+ ```Python
188
+
189
+ # フィルター用の関数
190
+
191
+ def is_in_date_range(date):
192
+
193
+ return datetime.date(2011, 4, 1) <= date < datetime.date(2011, 4, 6)
194
+
195
+
196
+
197
+ # 上記関数に適合しない要素を取り除く
198
+
199
+ date_dict = dict(filter(lambda x: is_in_date_range(x[0]), date_dict.items()))
200
+
201
+ ```
202
+
203
+
204
+
205
+ 辞書のアイテム(キーと値)を取り出し、そのキーを関数に与えたときの結果を指標としています。
206
+
207
+ 難しく感じるかもしれませんが、これは慣れもありますので。
208
+
187
209
 
188
210
 
189
211
  ---

1

追記

2017/10/16 09:17

投稿

LouiS0616
LouiS0616

スコア35658

test CHANGED
@@ -76,6 +76,116 @@
76
76
 
77
77
 
78
78
 
79
+ コメントを受けて
80
+
81
+ ---
82
+
83
+ filterは便利な関数なのですが、慣れるまでは意味が分かりづらいかもしれませんね。
84
+
85
+ 簡単に説明すると、次のようになります。
86
+
87
+
88
+
89
+ filterは第一引数に関数を、第二引数にリストを取ります。
90
+
91
+ リストの要素ひとつひとつを関数に渡し、Falseである要素を取り除く働きをします。
92
+
93
+ 以下、簡単な実験コードです。
94
+
95
+ ```Python
96
+
97
+ >>> def ret_true(arg):
98
+
99
+ ... return True
100
+
101
+ ...
102
+
103
+ >>> def ret_false(arg):
104
+
105
+ ... return False
106
+
107
+ ...
108
+
109
+ >>> def over_3(arg):
110
+
111
+ ... return arg > 3
112
+
113
+ ...
114
+
115
+ >>> my_list = list(range(10))
116
+
117
+ >>> my_list
118
+
119
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
120
+
121
+ >>>
122
+
123
+ >>> list(filter(ret_true, my_list))
124
+
125
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
126
+
127
+ >>>
128
+
129
+ >>> list(filter(ret_false, my_list))
130
+
131
+ []
132
+
133
+ >>>
134
+
135
+ >>> list(filter(over_3, my_list))
136
+
137
+ [4, 5, 6, 7, 8, 9]
138
+
139
+ ```
140
+
141
+
142
+
143
+ 条件に合わない要素を取り除く働きが分かりますでしょうか。
144
+
145
+ なお上記の解説は、簡潔な一方で若干不正確です。正確な解説は[こちら](https://docs.python.jp/3/library/functions.html#filter)。
146
+
147
+
148
+
149
+ ---
150
+
151
+ 次に、ラムダ式というものを利用して前述の実験コードを書き直してみます。
152
+
153
+ ```Python
154
+
155
+ >>> my_list = list(range(10))
156
+
157
+ >>> my_list
158
+
159
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
160
+
161
+ >>>
162
+
163
+ >>> list(filter(lambda arg: True, my_list))
164
+
165
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
166
+
167
+ >>>
168
+
169
+ >>> list(filter(lambda arg: False, my_list))
170
+
171
+ []
172
+
173
+ >>>
174
+
175
+ >>> list(filter(lambda arg: arg > 3, my_list))
176
+
177
+ [4, 5, 6, 7, 8, 9]
178
+
179
+ ```
180
+
181
+
182
+
183
+ このように、いちいち使い捨てる関数を定義しないで用いることが出来ます。
184
+
185
+ 私のコードでは、ラムダ式と関数とを組み合わせる形でフィルタリングを実現しています。
186
+
187
+
188
+
79
189
  ---
80
190
 
81
191
  Teratailには、コードを上記のように見やすく表示する機能があります。