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

回答編集履歴

4

コード修正

2018/04/17 01:07

投稿

hayataka2049
hayataka2049

スコア30939

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

ことばをたす

2018/04/17 01:07

投稿

hayataka2049
hayataka2049

スコア30939

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

修正

2018/04/17 00:52

投稿

hayataka2049
hayataka2049

スコア30939

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

追記

2018/04/17 00:46

投稿

hayataka2049
hayataka2049

スコア30939

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
+ 代入「文」は一行消費しちゃうので、これを使う処理は基本的に一行で綺麗には書けないことを覚えておくと良いでしょう。