回答編集履歴
5
途中で送信されてしまったので
answer
CHANGED
File without changes
|
4
修正
answer
CHANGED
@@ -116,13 +116,15 @@
|
|
116
116
|
|
117
117
|
次のように書いても、結果は一緒です。
|
118
118
|
```Python
|
119
|
-
for key
|
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
追記
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
追記
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
追記
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の場合、インデントが崩れるとコードの意味が変わってしまいます。**
|