回答編集履歴

23

テキスト修正

2019/05/26 11:45

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/05/26 11:45

投稿

jun68ykt
jun68ykt

スコア9058

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
 

21

テキスト修正

2019/05/26 11:41

投稿

jun68ykt
jun68ykt

スコア9058

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 の第引数に `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
 

20

テキスト修正

2019/05/26 11:06

投稿

jun68ykt
jun68ykt

スコア9058

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
 

19

テキスト修正

2019/05/26 08:53

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/05/26 08:23

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -132,7 +132,11 @@
132
132
 
133
133
 
134
134
 
135
- 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数渡す `lambda` として書けば以下のようにリスト内包表記だけ書けます。
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

テキスト修正

2019/05/26 08:22

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/05/25 04:45

投稿

jun68ykt
jun68ykt

スコア9058

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)を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
136
136
 
137
137
 
138
138
 

15

テキスト修正

2019/05/25 01:52

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -132,7 +132,7 @@
132
132
 
133
133
 
134
134
 
135
- 先の回答で作成した関数 `replace_sentence(sent, rule)` でっていることの `for` ループを `reduce` を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
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

テキスト修正

2019/05/25 01:46

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/05/25 01:27

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -132,7 +132,7 @@
132
132
 
133
133
 
134
134
 
135
- 先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` を使って `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
135
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
136
136
 
137
137
 
138
138
 

12

テキスト修正

2019/05/25 00:25

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/05/25 00:14

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -162,4 +162,4 @@
162
162
 
163
163
  ```
164
164
 
165
- - **動作確認用のサンプル:** [https://repl.it/@jun68ykt/Q191160-2](https://repl.it/@jun68ykt/Q191160-2)
165
+ - **動作確認用のコード:** [https://repl.it/@jun68ykt/Q191160-2](https://repl.it/@jun68ykt/Q191160-2)

10

テキスト修正

2019/05/25 00:11

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -150,7 +150,7 @@
150
150
 
151
151
  reduce(
152
152
 
153
- lambda s, r: re.sub('|'.join(['/'.join(s) for s in r[1]]), r[0], '/'.join(s)).split('/'),
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

テキスト修正

2019/05/24 23:35

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/05/24 23:28

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- 以下ような関数 `replace_sentence(sent, rule)`を用意しておきます。
9
+ 置き換え対象リスト `sent` に、置き換えルール `rule` した結果のリストを返す、以下のような関数を用意しておきます。
10
10
 
11
11
  ```python3
12
12
 

7

テキスト修正

2019/05/24 13:32

投稿

jun68ykt
jun68ykt

スコア9058

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
- 上記のような関数 `replace_sentence(sent, rule)`を用意しておいて、以下のようにます。
37
+ 上記の `replace_sentence(sent, rule)` 使うことにより`l = [a, b, c]` に対する処理は、以下のようになります。
36
38
 
37
39
 
38
40
 

6

テキスト修正

2019/05/24 13:23

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -114,11 +114,11 @@
114
114
 
115
115
 
116
116
 
117
- 以下, Repl.it に実行確認用のコードを上げました。
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

テキスト修正

2019/05/24 13:07

投稿

jun68ykt
jun68ykt

スコア9058

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, '/'.join(sent)).split('/')
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

テキスト修正

2019/05/24 12:45

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/05/24 12:14

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -102,4 +102,4 @@
102
102
 
103
103
  `"STUDENTS" : [["STUDENT", "たち"], ["STUDENT", "ら"]]`
104
104
 
105
- よりも先に適用される必要があるので、ルールのdict `rule` は、ソースに書いたとおりに順番が保存されている必要があで、実行には Python のバージョン 3.7以上が必要です。
105
+ よりも先に適用される必要があるので、ルールのdict `rule` は、ソースに書いたとおりに順番が保存されている必要があります。そため実行には、dictのエントリの順番が保存されるようになった Python のバージョン 3.7以上が必要です。

2

テキスト修正

2019/05/24 11:53

投稿

jun68ykt
jun68ykt

スコア9058

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

テキスト修正

2019/05/24 11:52

投稿

jun68ykt
jun68ykt

スコア9058

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