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

回答編集履歴

23

テキスト修正

2019/05/26 11:45

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -67,7 +67,7 @@
67
67
 
68
68
  関数を作らずに、リスト内包表記の中にすべてを詰め込んでみます。
69
69
 
70
- 先の回答で作成した関数 `replace_sentence(sent, rule)` では、全てのルールを順に適用させていくために`for` ループを使っていますが、これを [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)で実現します。そうすると、各ルールごとの変換は、 reduce の第1引数に `lambda` として書くことになり、以下のようになります。
70
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` では、全てのルールを順に適用させていくために`for` ループを使っていますが、これを [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)で実現します。そうすると、各ルールごとの変換処理は、 reduce の第1引数に `lambda` として書くことができ、以下のようになります。
71
71
 
72
72
  ```python3
73
73
  import re

22

テキスト修正

2019/05/26 11:45

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -67,7 +67,7 @@
67
67
 
68
68
  関数を作らずに、リスト内包表記の中にすべてを詰め込んでみます。
69
69
 
70
- 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールを順に適用させていくループのために`for` ではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使います。そうすると、各ルールごとの変換は、 reduce の第1引数に `lambda` として書くことになり、以下のようになります。
70
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` で、全てのルールを順に適用させていくために`for` ループを使っていますが、これを [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)で実現します。そうすると、各ルールごとの変換は、 reduce の第1引数に `lambda` として書くことになり、以下のようになります。
71
71
 
72
72
  ```python3
73
73
  import re

21

テキスト修正

2019/05/26 11:41

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -67,7 +67,7 @@
67
67
 
68
68
  関数を作らずに、リスト内包表記の中にすべてを詰め込んでみます。
69
69
 
70
- 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループ、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使います。そうすると、各ルールごとの変換は、 reduce の第引数に `lambda` として書くことになり、以下のようになります。
70
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールを順に適用させていくループのために、 `for` ではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使います。そうすると、各ルールごとの変換は、 reduce の第1引数に `lambda` として書くことになり、以下のようになります。
71
71
 
72
72
  ```python3
73
73
  import re

20

テキスト修正

2019/05/26 11:06

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -67,7 +67,7 @@
67
67
 
68
68
  関数を作らずに、リスト内包表記の中にすべてを詰め込んでみます。
69
69
 
70
- 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換 reduce の第1引数に渡す `lambda` として書けば、以下のようになります。
70
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使います。そうすると、各ルールごとの変換は、 reduce の第1引数に `lambda` として書くことになり、以下のようになります。
71
71
 
72
72
  ```python3
73
73
  import re

19

テキスト修正

2019/05/26 08:53

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -67,7 +67,7 @@
67
67
 
68
68
  関数を作らずに、リスト内包表記の中にすべてを詰め込んでみます。
69
69
 
70
- 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数に渡す `lambda` として書けば、以下のように書けます。
70
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数に渡す `lambda` として書けば、以下のようになります。
71
71
 
72
72
  ```python3
73
73
  import re

18

テキスト修正

2019/05/26 08:23

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -65,8 +65,10 @@
65
65
 
66
66
  ### 追記3
67
67
 
68
- 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数渡す `lambda` として書けば以下のようにリスト内包表記だけ書けます。
68
+ 関数を作らずに、リスト内包表記の中にすべてを詰め込んます。
69
69
 
70
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数に渡す `lambda` として書けば、以下のように書けます。
71
+
70
72
  ```python3
71
73
  import re
72
74
  from functools import reduce

17

テキスト修正

2019/05/26 08:22

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -65,7 +65,7 @@
65
65
 
66
66
  ### 追記3
67
67
 
68
- 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を `lambda` に書き換えけば、以下のようにリスト内包表記だけで書けます。
68
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている、全てのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を reduce の第1引数に渡す `lambda` としけば、以下のようにリスト内包表記だけで書けます。
69
69
 
70
70
  ```python3
71
71
  import re

16

テキスト修正

2019/05/25 04:45

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -65,7 +65,7 @@
65
65
 
66
66
  ### 追記3
67
67
 
68
- 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っている全ルールループを、 `for` ではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
68
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` で行っているてのルールをたどるループを、 `for` ループではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
69
69
 
70
70
  ```python3
71
71
  import re

15

テキスト修正

2019/05/25 01:52

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -65,7 +65,7 @@
65
65
 
66
66
  ### 追記3
67
67
 
68
- 先の回答で作成した関数 `replace_sentence(sent, rule)` でっていること `for` ループを `reduce` を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
68
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` でっている全ルールのループを `for` ではなく [reduce](https://docs.python.org/3/library/functools.html#functools.reduce)を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
69
69
 
70
70
  ```python3
71
71
  import re

14

テキスト修正

2019/05/25 01:46

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  正規表現を使う方法を考えました。
4
4
 
5
- 置き換え対象のリスト `sent` に、置き換えルール `rule` を適用した結果のリストを返す、以下のような関数を用意しておきます。
5
+ 置き換え対象のリスト `sent` に、置き換えルール `rule` を適用した結果のリストを返す、以下のような関数を用意しておきます。
6
6
  ```python3
7
7
  import re
8
8
 

13

テキスト修正

2019/05/25 01:27

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -65,7 +65,7 @@
65
65
 
66
66
  ### 追記3
67
67
 
68
- 先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` を使って `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
68
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` を使い、各ルールごとの変換を `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
69
69
 
70
70
  ```python3
71
71
  import re

12

テキスト修正

2019/05/25 00:25

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -65,7 +65,7 @@
65
65
 
66
66
  ### 追記3
67
67
 
68
- 先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` 書き換えていけば、以下のようにリスト内包表記だけで書けます。
68
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` を使って `lambda` に書き換えていけば、以下のようにリスト内包表記だけで書けます。
69
69
 
70
70
  ```python3
71
71
  import re

11

テキスト修正

2019/05/25 00:14

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -80,4 +80,4 @@
80
80
  ) for sent in l
81
81
  ]
82
82
  ```
83
- - **動作確認用のサンプル:** [https://repl.it/@jun68ykt/Q191160-2](https://repl.it/@jun68ykt/Q191160-2)
83
+ - **動作確認用のコード:** [https://repl.it/@jun68ykt/Q191160-2](https://repl.it/@jun68ykt/Q191160-2)

10

テキスト修正

2019/05/25 00:11

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -74,7 +74,7 @@
74
74
 
75
75
  l = [
76
76
  reduce(
77
- lambda s, r: re.sub('|'.join(['/'.join(s) for s in r[1]]), r[0], '/'.join(s)).split('/'),
77
+ lambda s, r: re.sub('|'.join(['/'.join(e) for e in r[1]]), r[0], '/'.join(s)).split('/'),
78
78
  rule.items(),
79
79
  sent
80
80
  ) for sent in l

9

テキスト修正

2019/05/24 23:35

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -61,4 +61,23 @@
61
61
 
62
62
  - **動作確認用のコード:** [https://repl.it/@jun68ykt/Q191160](https://repl.it/@jun68ykt/Q191160)
63
63
 
64
- ただし、 使われているPython のバージョンが現時点では 3.6 だったので、 `rule` は単なるdictではなく`OrderedDict` を使って、適用されるルールの順番が意図通りになるようにしています。
64
+ ただし、 使われているPython のバージョンが現時点では 3.6 だったので、 `rule` は単なるdictではなく`OrderedDict` を使って、適用されるルールの順番が意図通りになるようにしています。
65
+
66
+ ### 追記3
67
+
68
+ 先の回答で作成した関数 `replace_sentence(sent, rule)` でやっていることの `for` ループを `reduce` で書き換えていけば、以下のようにリスト内包表記だけで書けます。
69
+
70
+ ```python3
71
+ import re
72
+ from functools import reduce
73
+
74
+
75
+ l = [
76
+ reduce(
77
+ lambda s, r: re.sub('|'.join(['/'.join(s) for s in r[1]]), r[0], '/'.join(s)).split('/'),
78
+ rule.items(),
79
+ sent
80
+ ) for sent in l
81
+ ]
82
+ ```
83
+ - **動作確認用のサンプル:** [https://repl.it/@jun68ykt/Q191160-2](https://repl.it/@jun68ykt/Q191160-2)

8

テキスト修正

2019/05/24 23:28

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  正規表現を使う方法を考えました。
4
4
 
5
- 以下のような関数 `replace_sentence(sent, rule)`を用意しておきます。
5
+ 置き換え対象のリスト `sent` に、置き換えルール `rule` を適用した結果のリストを返す、以下のような関数を用意しておきます。
6
6
  ```python3
7
7
  import re
8
8
 

7

テキスト修正

2019/05/24 13:32

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,7 +1,8 @@
1
1
  こんにちは
2
2
 
3
- より良い方法があるかもしれませんが、正規表現を使う方法を考えましたので、回答します
3
+ 正規表現を使う方法を考えました。
4
4
 
5
+ 以下のような関数 `replace_sentence(sent, rule)`を用意しておきます。
5
6
  ```python3
6
7
  import re
7
8
 
@@ -15,7 +16,7 @@
15
16
  return sent.split('/')
16
17
  ```
17
18
 
18
- 上記のような関数 `replace_sentence(sent, rule)`を用意しておいて、以下のようにます。
19
+ 上記の `replace_sentence(sent, rule)` 使うことにより`l = [a, b, c]` に対する処理は、以下のようになります。
19
20
 
20
21
  ```python3
21
22
  rule = {

6

テキスト修正

2019/05/24 13:23

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -56,8 +56,8 @@
56
56
 
57
57
  ### 追記2
58
58
 
59
- 以下, Repl.it に実行確認用のコードを上げました。
59
+ Repl.it に実行確認用のコードを上げました。
60
60
 
61
- - [https://repl.it/@jun68ykt/Q191160](https://repl.it/@jun68ykt/Q191160)
61
+ - **動作確認用のコード:** [https://repl.it/@jun68ykt/Q191160](https://repl.it/@jun68ykt/Q191160)
62
62
 
63
63
  ただし、 使われているPython のバージョンが現時点では 3.6 だったので、 `rule` は単なるdictではなく`OrderedDict` を使って、適用されるルールの順番が意図通りになるようにしています。

5

テキスト修正

2019/05/24 13:07

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -7,11 +7,12 @@
7
7
 
8
8
 
9
9
  def replace_sentence(sent, rule):
10
+ sent = '/'.join(sent)
10
11
  for key, val in rule.items():
11
12
  regexp = '|'.join(['/'.join(e) for e in val])
12
- sent = re.sub(regexp, key, '/'.join(sent)).split('/')
13
+ sent = re.sub(regexp, key, sent)
13
14
 
14
- return sent
15
+ return sent.split('/')
15
16
  ```
16
17
 
17
18
  上記のような関数 `replace_sentence(sent, rule)`を用意しておいて、以下のようにします。

4

テキスト修正

2019/05/24 12:45

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -42,7 +42,7 @@
42
42
  [['STUDENT', 'が', 'FRUIT_EAT'], ['TEACHERS', 'は', 'FRUIT_EAT'], ['TEACHER', 'と', 'STUDENTS', 'は', 'ブドウ', 'を', '食べた']]
43
43
  ```
44
44
 
45
- ### 補足
45
+ ### 追記1
46
46
 
47
47
  質問者様はすでにご承知かとは思いますが、以下、念のための補足です。
48
48
 
@@ -50,4 +50,13 @@
50
50
  `"STUDENT" : [["生徒"], ["学生"]]`
51
51
  は、
52
52
  `"STUDENTS" : [["STUDENT", "たち"], ["STUDENT", "ら"]]`
53
- よりも先に適用される必要があるので、ルールのdict `rule` は、ソースに書いたとおりに順番が保存されている必要があります。そのため実行には、dictのエントリの順番が保存されるようになった Python のバージョン 3.7以上が必要です。
53
+ よりも先に適用される必要があるので、ルールのdict `rule` は、ソースに書いたとおりに順番が保存されている必要があります。そのため実行には、dictのエントリの順番が保存されるようになった Python のバージョン 3.7以上が必要です。
54
+
55
+
56
+ ### 追記2
57
+
58
+ 以下, Repl.it に実行確認用のコードを上げました。
59
+
60
+ - [https://repl.it/@jun68ykt/Q191160](https://repl.it/@jun68ykt/Q191160)
61
+
62
+ ただし、 使われているPython のバージョンが現時点では 3.6 だったので、 `rule` は単なるdictではなく`OrderedDict` を使って、適用されるルールの順番が意図通りになるようにしています。

3

テキスト修正

2019/05/24 12:14

投稿

jun68ykt
jun68ykt

スコア9058

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

2

テキスト修正

2019/05/24 11:53

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -40,4 +40,14 @@
40
40
 
41
41
  ```
42
42
  [['STUDENT', 'が', 'FRUIT_EAT'], ['TEACHERS', 'は', 'FRUIT_EAT'], ['TEACHER', 'と', 'STUDENTS', 'は', 'ブドウ', 'を', '食べた']]
43
- ```
43
+ ```
44
+
45
+ ### 補足
46
+
47
+ 質問者様はすでにご承知かとは思いますが、以下、念のための補足です。
48
+
49
+ ルールの
50
+ `"STUDENT" : [["生徒"], ["学生"]]`
51
+ は、
52
+ `"STUDENTS" : [["STUDENT", "たち"], ["STUDENT", "ら"]]`
53
+ よりも先に適用される必要があるので、ルールのdict `rule` は、ソースに書いたとおりに順番が保存されている必要があるので、実行には Python のバージョン 3.7以上が必要です。

1

テキスト修正

2019/05/24 11:52

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -6,17 +6,15 @@
6
6
  import re
7
7
 
8
8
 
9
- def replace_sentence(sent):
9
+ def replace_sentence(sent, rule):
10
10
  for key, val in rule.items():
11
11
  regexp = '|'.join(['/'.join(e) for e in val])
12
12
  sent = re.sub(regexp, key, '/'.join(sent)).split('/')
13
13
 
14
14
  return sent
15
-
16
-
17
15
  ```
18
16
 
19
- 上記のような関数 `replace_sentence(sent)`を用意しておいて、以下のようにします。
17
+ 上記のような関数 `replace_sentence(sent, rule)`を用意しておいて、以下のようにします。
20
18
 
21
19
  ```python3
22
20
  rule = {
@@ -32,9 +30,8 @@
32
30
 
33
31
  l = [a, b, c]
34
32
 
33
+ l = [replace_sentence(sent, rule) for sent in l]
35
34
 
36
- l = [replace_sentence(sent) for sent in l]
37
-
38
35
  print(l)
39
36
 
40
37
  ```