回答編集履歴
23
テキスト修正
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
|
138
138
|
|
139
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` では、全てのルールを順に適用させていくために`for` ループを使っていますが、これを [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)で実現します。そうすると、各ルールごとの変換は、 reduce の第1引数に `lambda` として書くこと
|
139
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` では、全てのルールを順に適用させていくために`for` ループを使っていますが、これを [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)で実現します。そうすると、各ルールごとの変換処理は、 reduce の第1引数に `lambda` として書くことができ、以下のようになります。
|
140
140
|
|
141
141
|
|
142
142
|
|
22
テキスト修正
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
|
138
138
|
|
139
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` で
|
139
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` では、全てのルールを順に適用させていくために`for` ループを使っていますが、これを [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)で実現します。そうすると、各ルールごとの変換は、 reduce の第1引数に `lambda` として書くことになり、以下のようになります。
|
140
140
|
|
141
141
|
|
142
142
|
|
21
テキスト修正
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
|
138
138
|
|
139
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールを
|
139
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールを順に適用させていくループのために、 `for` ではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使います。そうすると、各ルールごとの変換は、 reduce の第1引数に `lambda` として書くことになり、以下のようになります。
|
140
140
|
|
141
141
|
|
142
142
|
|
20
テキスト修正
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
|
138
138
|
|
139
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換
|
139
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使います。そうすると、各ルールごとの変換は、 reduce の第1引数に `lambda` として書くことになり、以下のようになります。
|
140
140
|
|
141
141
|
|
142
142
|
|
19
テキスト修正
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
|
138
138
|
|
139
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数に渡す `lambda` として書けば、以下のように
|
139
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数に渡す `lambda` として書けば、以下のようになります。
|
140
140
|
|
141
141
|
|
142
142
|
|
18
テキスト修正
test
CHANGED
@@ -132,7 +132,11 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
|
135
|
-
|
135
|
+
関数を作らずに、リスト内包表記の中にすべてを詰め込んでみます。
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数に渡す `lambda` として書けば、以下のように書けます。
|
136
140
|
|
137
141
|
|
138
142
|
|
17
テキスト修正
test
CHANGED
@@ -132,7 +132,7 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
|
135
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を `lambda`
|
135
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数に渡す `lambda` として書けば、以下のようにリスト内包表記だけで書けます。
|
136
136
|
|
137
137
|
|
138
138
|
|
16
テキスト修正
test
CHANGED
@@ -132,7 +132,7 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
|
135
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている全ルール
|
135
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
|
136
136
|
|
137
137
|
|
138
138
|
|
15
テキスト修正
test
CHANGED
@@ -132,7 +132,7 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
|
135
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` で
|
135
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている全ルールのループを、 `for` ではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
|
136
136
|
|
137
137
|
|
138
138
|
|
14
テキスト修正
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
置き換え対象のリスト `sent` に、置き換えルール `rule` を適用した結果のリストを返す、以下のような関数を用意しておきます。
|
9
|
+
置き換え対象のリスト `sent` に、置き換えルール集 `rule` を適用した結果のリストを返す、以下のような関数を用意しておきます。
|
10
10
|
|
11
11
|
```python3
|
12
12
|
|
13
テキスト修正
test
CHANGED
@@ -132,7 +132,7 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
|
135
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` を使
|
135
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
|
136
136
|
|
137
137
|
|
138
138
|
|
12
テキスト修正
test
CHANGED
@@ -132,7 +132,7 @@
|
|
132
132
|
|
133
133
|
|
134
134
|
|
135
|
-
先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce`
|
135
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` を使って `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
|
136
136
|
|
137
137
|
|
138
138
|
|
11
テキスト修正
test
CHANGED
@@ -162,4 +162,4 @@
|
|
162
162
|
|
163
163
|
```
|
164
164
|
|
165
|
-
- **動作確認用の
|
165
|
+
- **動作確認用のコード:** [https://repl.it/@jun68ykt/Q191160-2](https://repl.it/@jun68ykt/Q191160-2)
|
10
テキスト修正
test
CHANGED
@@ -150,7 +150,7 @@
|
|
150
150
|
|
151
151
|
reduce(
|
152
152
|
|
153
|
-
lambda s, r: re.sub('|'.join(['/'.join(
|
153
|
+
lambda s, r: re.sub('|'.join(['/'.join(e) for e in r[1]]), r[0], '/'.join(s)).split('/'),
|
154
154
|
|
155
155
|
rule.items(),
|
156
156
|
|
9
テキスト修正
test
CHANGED
@@ -125,3 +125,41 @@
|
|
125
125
|
|
126
126
|
|
127
127
|
ただし、 使われているPython のバージョンが現時点では 3.6 だったので、 `rule` は単なるdictではなく`OrderedDict` を使って、適用されるルールの順番が意図通りになるようにしています。
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
### 追記3
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` で書き換えていけば、以下のようにリスト内包表記だけで書けます。
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
```python3
|
140
|
+
|
141
|
+
import re
|
142
|
+
|
143
|
+
from functools import reduce
|
144
|
+
|
145
|
+
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
l = [
|
150
|
+
|
151
|
+
reduce(
|
152
|
+
|
153
|
+
lambda s, r: re.sub('|'.join(['/'.join(s) for s in r[1]]), r[0], '/'.join(s)).split('/'),
|
154
|
+
|
155
|
+
rule.items(),
|
156
|
+
|
157
|
+
sent
|
158
|
+
|
159
|
+
) for sent in l
|
160
|
+
|
161
|
+
]
|
162
|
+
|
163
|
+
```
|
164
|
+
|
165
|
+
- **動作確認用のサンプル:** [https://repl.it/@jun68ykt/Q191160-2](https://repl.it/@jun68ykt/Q191160-2)
|
8
テキスト修正
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
|
9
|
+
置き換え対象のリスト `sent` に、置き換えルール `rule` を適用した結果のリストを返す、以下のような関数を用意しておきます。
|
10
10
|
|
11
11
|
```python3
|
12
12
|
|
7
テキスト修正
test
CHANGED
@@ -2,9 +2,11 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
|
5
|
+
正規表現を使う方法を考えました。
|
6
6
|
|
7
7
|
|
8
|
+
|
9
|
+
以下のような関数 `replace_sentence(sent, rule)`を用意しておきます。
|
8
10
|
|
9
11
|
```python3
|
10
12
|
|
@@ -32,7 +34,7 @@
|
|
32
34
|
|
33
35
|
|
34
36
|
|
35
|
-
上記の
|
37
|
+
上記の `replace_sentence(sent, rule)` を使うことにより、`l = [a, b, c]` に対する処理は、以下のようになります。
|
36
38
|
|
37
39
|
|
38
40
|
|
6
テキスト修正
test
CHANGED
@@ -114,11 +114,11 @@
|
|
114
114
|
|
115
115
|
|
116
116
|
|
117
|
-
|
117
|
+
Repl.it に実行確認用のコードを上げました。
|
118
118
|
|
119
119
|
|
120
120
|
|
121
|
-
- [https://repl.it/@jun68ykt/Q191160](https://repl.it/@jun68ykt/Q191160)
|
121
|
+
- **動作確認用のコード:** [https://repl.it/@jun68ykt/Q191160](https://repl.it/@jun68ykt/Q191160)
|
122
122
|
|
123
123
|
|
124
124
|
|
5
テキスト修正
test
CHANGED
@@ -16,15 +16,17 @@
|
|
16
16
|
|
17
17
|
def replace_sentence(sent, rule):
|
18
18
|
|
19
|
+
sent = '/'.join(sent)
|
20
|
+
|
19
21
|
for key, val in rule.items():
|
20
22
|
|
21
23
|
regexp = '|'.join(['/'.join(e) for e in val])
|
22
24
|
|
23
|
-
sent = re.sub(regexp, key,
|
25
|
+
sent = re.sub(regexp, key, sent)
|
24
26
|
|
25
27
|
|
26
28
|
|
27
|
-
return sent
|
29
|
+
return sent.split('/')
|
28
30
|
|
29
31
|
```
|
30
32
|
|
4
テキスト修正
test
CHANGED
@@ -86,7 +86,7 @@
|
|
86
86
|
|
87
87
|
|
88
88
|
|
89
|
-
###
|
89
|
+
### 追記1
|
90
90
|
|
91
91
|
|
92
92
|
|
@@ -103,3 +103,21 @@
|
|
103
103
|
`"STUDENTS" : [["STUDENT", "たち"], ["STUDENT", "ら"]]`
|
104
104
|
|
105
105
|
よりも先に適用される必要があるので、ルールのdict `rule` は、ソースに書いたとおりに順番が保存されている必要があります。そのため実行には、dictのエントリの順番が保存されるようになった Python のバージョン 3.7以上が必要です。
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
111
|
+
### 追記2
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
以下, Repl.it に実行確認用のコードを上げました。
|
116
|
+
|
117
|
+
|
118
|
+
|
119
|
+
- [https://repl.it/@jun68ykt/Q191160](https://repl.it/@jun68ykt/Q191160)
|
120
|
+
|
121
|
+
|
122
|
+
|
123
|
+
ただし、 使われているPython のバージョンが現時点では 3.6 だったので、 `rule` は単なるdictではなく`OrderedDict` を使って、適用されるルールの順番が意図通りになるようにしています。
|
3
テキスト修正
test
CHANGED
@@ -102,4 +102,4 @@
|
|
102
102
|
|
103
103
|
`"STUDENTS" : [["STUDENT", "たち"], ["STUDENT", "ら"]]`
|
104
104
|
|
105
|
-
よりも先に適用される必要があるので、ルールのdict `rule` は、ソースに書いたとおりに順番が保存されている必要があ
|
105
|
+
よりも先に適用される必要があるので、ルールのdict `rule` は、ソースに書いたとおりに順番が保存されている必要があります。そのため実行には、dictのエントリの順番が保存されるようになった Python のバージョン 3.7以上が必要です。
|
2
テキスト修正
test
CHANGED
@@ -83,3 +83,23 @@
|
|
83
83
|
[['STUDENT', 'が', 'FRUIT_EAT'], ['TEACHERS', 'は', 'FRUIT_EAT'], ['TEACHER', 'と', 'STUDENTS', 'は', 'ブドウ', 'を', '食べた']]
|
84
84
|
|
85
85
|
```
|
86
|
+
|
87
|
+
|
88
|
+
|
89
|
+
### 補足
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
質問者様はすでにご承知かとは思いますが、以下、念のための補足です。
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
ルールの
|
98
|
+
|
99
|
+
`"STUDENT" : [["生徒"], ["学生"]]`
|
100
|
+
|
101
|
+
は、
|
102
|
+
|
103
|
+
`"STUDENTS" : [["STUDENT", "たち"], ["STUDENT", "ら"]]`
|
104
|
+
|
105
|
+
よりも先に適用される必要があるので、ルールのdict `rule` は、ソースに書いたとおりに順番が保存されている必要があるので、実行には Python のバージョン 3.7以上が必要です。
|
1
テキスト修正
test
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
def replace_sentence(sent):
|
17
|
+
def replace_sentence(sent, rule):
|
18
18
|
|
19
19
|
for key, val in rule.items():
|
20
20
|
|
@@ -26,15 +26,11 @@
|
|
26
26
|
|
27
27
|
return sent
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
29
|
```
|
34
30
|
|
35
31
|
|
36
32
|
|
37
|
-
上記のような関数 `replace_sentence(sent)`を用意しておいて、以下のようにします。
|
33
|
+
上記のような関数 `replace_sentence(sent, rule)`を用意しておいて、以下のようにします。
|
38
34
|
|
39
35
|
|
40
36
|
|
@@ -66,9 +62,7 @@
|
|
66
62
|
|
67
63
|
|
68
64
|
|
69
|
-
|
70
|
-
|
71
|
-
l = [replace_sentence(sent) for sent in l]
|
65
|
+
l = [replace_sentence(sent, rule) for sent in l]
|
72
66
|
|
73
67
|
|
74
68
|
|