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

回答編集履歴

5

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

2017/10/16 09:32

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
File without changes

4

修正

2017/10/16 09:32

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -116,13 +116,15 @@
116
116
 
117
117
  次のように書いても、結果は一緒です。
118
118
  ```Python
119
- for key, value in date_dict:
119
+ for key in date_dict:
120
120
  if datetime.date(2011, 4, 1) <= key < datetime.date(2011, 4, 6):
121
121
  pass
122
122
  else:
123
123
  del date_dict[key]
124
124
  ```
125
125
 
126
+ こっちの書き方でも充分簡潔ですね。最初からこっちを書いた方が良かったかも。
127
+
126
128
  ---
127
129
  Teratailには、コードを上記のように見やすく表示する機能があります。
128
130
  編集画面を開き、コードを選択した状態で<code>ボタンを押してください。

3

追記

2017/10/16 09:31

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -103,7 +103,27 @@
103
103
  辞書のアイテム(キーと値)を取り出し、そのキーを関数に与えたときの結果を指標としています。
104
104
  難しく感じるかもしれませんが、これは慣れもありますので。
105
105
 
106
+ 結局なにをやっているのか?
106
107
  ---
108
+ ```Python
109
+ # フィルター用の関数
110
+ def is_in_date_range(date):
111
+ return datetime.date(2011, 4, 1) <= date < datetime.date(2011, 4, 6)
112
+
113
+ # 上記関数に適合しない要素を取り除く
114
+ date_dict = dict(filter(lambda x: is_in_date_range(x[0]), date_dict.items()))
115
+ ```
116
+
117
+ 次のように書いても、結果は一緒です。
118
+ ```Python
119
+ for key, value in date_dict:
120
+ if datetime.date(2011, 4, 1) <= key < datetime.date(2011, 4, 6):
121
+ pass
122
+ else:
123
+ del date_dict[key]
124
+ ```
125
+
126
+ ---
107
127
  Teratailには、コードを上記のように見やすく表示する機能があります。
108
128
  編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
109
129
  **特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。**

2

追記

2017/10/16 09:23

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -91,7 +91,18 @@
91
91
 
92
92
  このように、いちいち使い捨てる関数を定義しないで用いることが出来ます。
93
93
  私のコードでは、ラムダ式と関数とを組み合わせる形でフィルタリングを実現しています。
94
+ ```Python
95
+ # フィルター用の関数
96
+ def is_in_date_range(date):
97
+ return datetime.date(2011, 4, 1) <= date < datetime.date(2011, 4, 6)
94
98
 
99
+ # 上記関数に適合しない要素を取り除く
100
+ date_dict = dict(filter(lambda x: is_in_date_range(x[0]), date_dict.items()))
101
+ ```
102
+
103
+ 辞書のアイテム(キーと値)を取り出し、そのキーを関数に与えたときの結果を指標としています。
104
+ 難しく感じるかもしれませんが、これは慣れもありますので。
105
+
95
106
  ---
96
107
  Teratailには、コードを上記のように見やすく表示する機能があります。
97
108
  編集画面を開き、コードを選択した状態で<code>ボタンを押してください。

1

追記

2017/10/16 09:17

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -37,7 +37,62 @@
37
37
 
38
38
  『試したこと』に関しましては、よく理解できなかったのでスルーします。
39
39
 
40
+ コメントを受けて
40
41
  ---
42
+ filterは便利な関数なのですが、慣れるまでは意味が分かりづらいかもしれませんね。
43
+ 簡単に説明すると、次のようになります。
44
+
45
+ filterは第一引数に関数を、第二引数にリストを取ります。
46
+ リストの要素ひとつひとつを関数に渡し、Falseである要素を取り除く働きをします。
47
+ 以下、簡単な実験コードです。
48
+ ```Python
49
+ >>> def ret_true(arg):
50
+ ... return True
51
+ ...
52
+ >>> def ret_false(arg):
53
+ ... return False
54
+ ...
55
+ >>> def over_3(arg):
56
+ ... return arg > 3
57
+ ...
58
+ >>> my_list = list(range(10))
59
+ >>> my_list
60
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
61
+ >>>
62
+ >>> list(filter(ret_true, my_list))
63
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
64
+ >>>
65
+ >>> list(filter(ret_false, my_list))
66
+ []
67
+ >>>
68
+ >>> list(filter(over_3, my_list))
69
+ [4, 5, 6, 7, 8, 9]
70
+ ```
71
+
72
+ 条件に合わない要素を取り除く働きが分かりますでしょうか。
73
+ なお上記の解説は、簡潔な一方で若干不正確です。正確な解説は[こちら](https://docs.python.jp/3/library/functions.html#filter)。
74
+
75
+ ---
76
+ 次に、ラムダ式というものを利用して前述の実験コードを書き直してみます。
77
+ ```Python
78
+ >>> my_list = list(range(10))
79
+ >>> my_list
80
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
81
+ >>>
82
+ >>> list(filter(lambda arg: True, my_list))
83
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
84
+ >>>
85
+ >>> list(filter(lambda arg: False, my_list))
86
+ []
87
+ >>>
88
+ >>> list(filter(lambda arg: arg > 3, my_list))
89
+ [4, 5, 6, 7, 8, 9]
90
+ ```
91
+
92
+ このように、いちいち使い捨てる関数を定義しないで用いることが出来ます。
93
+ 私のコードでは、ラムダ式と関数とを組み合わせる形でフィルタリングを実現しています。
94
+
95
+ ---
41
96
  Teratailには、コードを上記のように見やすく表示する機能があります。
42
97
  編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
43
98
  **特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。**