回答編集履歴
4
コード修正
answer
CHANGED
@@ -41,7 +41,6 @@
|
|
41
41
|
|
42
42
|
```python
|
43
43
|
from functools import reduce
|
44
|
-
from collections import defaultdict
|
45
44
|
r=[[3, 20, 70], [3, 40, 170], [3, 59, 90], [4, 5, 55], [4, 25, 40]]
|
46
45
|
result_d = reduce(lambda d, e: dict((k, v+e[2]) if k == e[0] else (k, v) for k, v in d.items()) if e[0] in d else {k:v for k, v in list(d.items())+[(e[0], e[2])]}, [{}]+r)
|
47
46
|
```
|
3
ことばをたす
answer
CHANGED
@@ -29,6 +29,7 @@
|
|
29
29
|
私が言いたいのは「上記コードで十分シンプルなのに、これ以上いじくり回す必要があるのか」ということです。
|
30
30
|
|
31
31
|
### 追記
|
32
|
+
他の方に譲る、と書いてしまったが・・・。
|
32
33
|
一行で書く別解。forをreduceで隠蔽しただけでロジックは同じ。実用上のメリットはないので、使わない方が良いです。
|
33
34
|
```python
|
34
35
|
from functools import reduce
|
2
修正
answer
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
r=[[3, 20, 70], [3, 40, 170], [3, 59, 90], [4, 5, 55], [4, 25, 40]]
|
37
37
|
result_d = reduce(lambda d, e: (d.__setitem__(e[0], d[e[0]]+e[2]), d)[1], [defaultdict(int)]+r)
|
38
38
|
```
|
39
|
-
怪しい_setitem_をなくしたければ辞書をループの度に作って使い捨てれば良いですが、パフォーマンス上は不利です。そしてなおさら読めない代物になる(努力次第でもうちょっと綺麗に書ける可能性はありますが)。
|
39
|
+
怪しい_setitem_をなくしたければ辞書をループの度に作って使い捨てれば良いですが、パフォーマンス上は不利です。そしてなおさら読めない代物になる(努力と工夫とひらめき次第でもうちょっと綺麗に書ける可能性はありますが)。
|
40
40
|
|
41
41
|
```python
|
42
42
|
from functools import reduce
|
1
追記
answer
CHANGED
@@ -26,4 +26,22 @@
|
|
26
26
|
print(k, v)
|
27
27
|
```
|
28
28
|
これ以上単純化する方法は思いつきませんでした。ワンライナーで書くにしても、かえって黒魔術っぽくなっちゃうでしょう。そっちは他の方に譲ります(書く人がいれば)。
|
29
|
-
私が言いたいのは「上記コードで十分シンプルなのに、これ以上いじくり回す必要があるのか」ということです。
|
29
|
+
私が言いたいのは「上記コードで十分シンプルなのに、これ以上いじくり回す必要があるのか」ということです。
|
30
|
+
|
31
|
+
### 追記
|
32
|
+
一行で書く別解。forをreduceで隠蔽しただけでロジックは同じ。実用上のメリットはないので、使わない方が良いです。
|
33
|
+
```python
|
34
|
+
from functools import reduce
|
35
|
+
from collections import defaultdict
|
36
|
+
r=[[3, 20, 70], [3, 40, 170], [3, 59, 90], [4, 5, 55], [4, 25, 40]]
|
37
|
+
result_d = reduce(lambda d, e: (d.__setitem__(e[0], d[e[0]]+e[2]), d)[1], [defaultdict(int)]+r)
|
38
|
+
```
|
39
|
+
怪しい_setitem_をなくしたければ辞書をループの度に作って使い捨てれば良いですが、パフォーマンス上は不利です。そしてなおさら読めない代物になる(努力次第でもうちょっと綺麗に書ける可能性はありますが)。
|
40
|
+
|
41
|
+
```python
|
42
|
+
from functools import reduce
|
43
|
+
from collections import defaultdict
|
44
|
+
r=[[3, 20, 70], [3, 40, 170], [3, 59, 90], [4, 5, 55], [4, 25, 40]]
|
45
|
+
result_d = reduce(lambda d, e: dict((k, v+e[2]) if k == e[0] else (k, v) for k, v in d.items()) if e[0] in d else {k:v for k, v in list(d.items())+[(e[0], e[2])]}, [{}]+r)
|
46
|
+
```
|
47
|
+
代入「文」は一行消費しちゃうので、これを使う処理は基本的に一行で綺麗には書けないことを覚えておくと良いでしょう。
|