回答編集履歴
4
追記に関して
test
CHANGED
@@ -173,3 +173,107 @@
|
|
173
173
|
```
|
174
174
|
|
175
175
|
ご覧の通り可読性は悪いのですが、できなくはありません。
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
### 質問の追記に関して
|
180
|
+
|
181
|
+
恐らくzipや内包表記が入り乱れているのでわかりづらいのだと思います。
|
182
|
+
|
183
|
+
ナイーブに書くとこうなります。
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
```python
|
188
|
+
|
189
|
+
def count_diff(true_ans, exam_ans):
|
190
|
+
|
191
|
+
"""同じ文字列長を仮定
|
192
|
+
|
193
|
+
"""
|
194
|
+
|
195
|
+
diff_count = 0
|
196
|
+
|
197
|
+
for i in range(len(true_ans)):
|
198
|
+
|
199
|
+
if true_ans[i] != exam_ans[i]:
|
200
|
+
|
201
|
+
diff_count += 1
|
202
|
+
|
203
|
+
return diff_count
|
204
|
+
|
205
|
+
```
|
206
|
+
|
207
|
+
|
208
|
+
|
209
|
+
これはたぶん追っていけばわかるはずです。
|
210
|
+
|
211
|
+
ついでにzipの出力も確認しておくことにしましょう。
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
```python
|
218
|
+
|
219
|
+
>>> list(zip("head", "hhhh"))
|
220
|
+
|
221
|
+
[('h', 'h'), ('e', 'h'), ('a', 'h'), ('d', 'h')]
|
222
|
+
|
223
|
+
```
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
あとはリスト内包表記にするだけで、これは簡単です。
|
228
|
+
|
229
|
+
```python
|
230
|
+
|
231
|
+
sum([1 for c1, c2 in zip(right_answer, answer) if c1 != c2])
|
232
|
+
|
233
|
+
```
|
234
|
+
|
235
|
+
|
236
|
+
|
237
|
+
ただしLouiS0616さんのこのコードは、
|
238
|
+
|
239
|
+
|
240
|
+
|
241
|
+
```python
|
242
|
+
|
243
|
+
diff = sum(
|
244
|
+
|
245
|
+
1 for ra, a in zip(right_answer, answer) if ra != a
|
246
|
+
|
247
|
+
)
|
248
|
+
|
249
|
+
```
|
250
|
+
|
251
|
+
|
252
|
+
|
253
|
+
0. リスト内包表記ではなくジェネレータ式を使っている
|
254
|
+
|
255
|
+
1. ジェネレータ式を関数の引数として書く場合、かっこを省略できるという糖衣構文を使っている
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
ので一見すると理解しがたいものに見えます。
|
260
|
+
|
261
|
+
|
262
|
+
|
263
|
+
1については、ジェネレータ式はジェネレータを作るものです。ジェネレータとはなにかというと、だいたい次のようなポジションだと思ってください。
|
264
|
+
|
265
|
+
|
266
|
+
|
267
|
+
- イテレータ:forで繰り返し処理できるもの。文字列、リスト、タプル、"ジェネレータ"など
|
268
|
+
|
269
|
+
- ジェネレータ:動的に要素が生成されるイテレータ
|
270
|
+
|
271
|
+
|
272
|
+
|
273
|
+
2については、本来ジェネレータ式は()で囲うことで作ることができるのですが、関数の唯一の引数として渡された場合はこの()を省略できるというルールがあります。それを使われています。
|
274
|
+
|
275
|
+
|
276
|
+
|
277
|
+
参考:
|
278
|
+
|
279
|
+
[ジェネレータ式の文法について調べてみた ](http://www.rhoboro.com/2017/07/08/python-generator-grammer.html)
|
3
誤字修正
test
CHANGED
@@ -144,7 +144,7 @@
|
|
144
144
|
|
145
145
|
|
146
146
|
|
147
|
-
すっきりしたといえばすっきりしましたが、コード行数は大して減ってはいないという見方もできるでしょう。だけど
|
147
|
+
すっきりしたといえばすっきりしましたが、コード行数は大して減ってはいないという見方もできるでしょう。だけれど、これ以上複雑なことをやるとかえって見通しが悪くなるので、これくらいで良いのです。
|
148
148
|
|
149
149
|
|
150
150
|
|
2
編集
test
CHANGED
@@ -144,7 +144,7 @@
|
|
144
144
|
|
145
145
|
|
146
146
|
|
147
|
-
すっきりしたといえばすっきりした
|
147
|
+
すっきりしたといえばすっきりしましたが、コード行数は大して減ってはいないという見方もできるでしょう。だけどれ、これ以上複雑なことをやるとかえって見通しが悪くなるので、これくらいで良いのです。
|
148
148
|
|
149
149
|
|
150
150
|
|
1
追記
test
CHANGED
@@ -149,3 +149,27 @@
|
|
149
149
|
|
150
150
|
|
151
151
|
余談ですが、本当は私が先に思いついたのは下の例の方です。「まずは1問だけ採点する関数を作ろう。そうすれば、あとはできたも同然だ。そのために、まずは異なり文字数を数える関数を作るか」というような発想で書きました。参考にしてください。
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
### 追記
|
156
|
+
|
157
|
+
「lambda式は複雑な処理にはあまり適しません」と書いてしまいましたが、あえてlambdaバージョンのsaitenを作ってみた例。
|
158
|
+
|
159
|
+
```python
|
160
|
+
|
161
|
+
saiten = lambda true_ans, exam_ans:(
|
162
|
+
|
163
|
+
0
|
164
|
+
|
165
|
+
if len(true_ans) != len(exam_ans) else
|
166
|
+
|
167
|
+
(lambda count_diff:(
|
168
|
+
|
169
|
+
[2, 1][count_diff] if count_diff <= 1 else 0))(
|
170
|
+
|
171
|
+
sum([1 for c1, c2 in zip(true_ans, exam_ans) if c1 != c2])))
|
172
|
+
|
173
|
+
```
|
174
|
+
|
175
|
+
ご覧の通り可読性は悪いのですが、できなくはありません。
|