回答編集履歴

4

コード修正

2018/04/17 01:07

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -84,8 +84,6 @@
84
84
 
85
85
  from functools import reduce
86
86
 
87
- from collections import defaultdict
88
-
89
87
  r=[[3, 20, 70], [3, 40, 170], [3, 59, 90], [4, 5, 55], [4, 25, 40]]
90
88
 
91
89
  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)

3

ことばをたす

2018/04/17 01:07

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -60,6 +60,8 @@
60
60
 
61
61
  ### 追記
62
62
 
63
+ 他の方に譲る、と書いてしまったが・・・。
64
+
63
65
  一行で書く別解。forをreduceで隠蔽しただけでロジックは同じ。実用上のメリットはないので、使わない方が良いです。
64
66
 
65
67
  ```python

2

修正

2018/04/17 00:52

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -74,7 +74,7 @@
74
74
 
75
75
  ```
76
76
 
77
- 怪しい_setitem_をなくしたければ辞書をループの度に作って使い捨てれば良いですが、パフォーマンス上は不利です。そしてなおさら読めない代物になる(努力次第でもうちょっと綺麗に書ける可能性はありますが)。
77
+ 怪しい_setitem_をなくしたければ辞書をループの度に作って使い捨てれば良いですが、パフォーマンス上は不利です。そしてなおさら読めない代物になる(努力と工夫とひらめき次第でもうちょっと綺麗に書ける可能性はありますが)。
78
78
 
79
79
 
80
80
 

1

追記

2018/04/17 00:46

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -55,3 +55,39 @@
55
55
  これ以上単純化する方法は思いつきませんでした。ワンライナーで書くにしても、かえって黒魔術っぽくなっちゃうでしょう。そっちは他の方に譲ります(書く人がいれば)。
56
56
 
57
57
  私が言いたいのは「上記コードで十分シンプルなのに、これ以上いじくり回す必要があるのか」ということです。
58
+
59
+
60
+
61
+ ### 追記
62
+
63
+ 一行で書く別解。forをreduceで隠蔽しただけでロジックは同じ。実用上のメリットはないので、使わない方が良いです。
64
+
65
+ ```python
66
+
67
+ from functools import reduce
68
+
69
+ from collections import defaultdict
70
+
71
+ r=[[3, 20, 70], [3, 40, 170], [3, 59, 90], [4, 5, 55], [4, 25, 40]]
72
+
73
+ result_d = reduce(lambda d, e: (d.__setitem__(e[0], d[e[0]]+e[2]), d)[1], [defaultdict(int)]+r)
74
+
75
+ ```
76
+
77
+ 怪しい_setitem_をなくしたければ辞書をループの度に作って使い捨てれば良いですが、パフォーマンス上は不利です。そしてなおさら読めない代物になる(努力次第でもうちょっと綺麗に書ける可能性はありますが)。
78
+
79
+
80
+
81
+ ```python
82
+
83
+ from functools import reduce
84
+
85
+ from collections import defaultdict
86
+
87
+ r=[[3, 20, 70], [3, 40, 170], [3, 59, 90], [4, 5, 55], [4, 25, 40]]
88
+
89
+ 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)
90
+
91
+ ```
92
+
93
+ 代入「文」は一行消費しちゃうので、これを使う処理は基本的に一行で綺麗には書けないことを覚えておくと良いでしょう。