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

回答編集履歴

3

コードの解説(コメントへの回答)

2017/07/31 13:18

投稿

what_alnk
what_alnk

スコア147

answer CHANGED
@@ -37,4 +37,22 @@
37
37
  です.
38
38
  また,今の方針だと,一度違うグループだと判定されたものが後から同じグループに属するようになった場合には対処できません.
39
39
 
40
- なので,いったん 要素の`0`番目が`0`のものをすべて取り出しておいて,あとからもう一度ループを回して処理するという方針にしました.
40
+ なので,いったん 要素の`0`番目が`0`のものをすべて取り出しておいて,あとからもう一度ループを回して処理するという方針にしました.
41
+
42
+ ---
43
+
44
+ Yの各要素について,自分以外の要素と共通な数値を持つかどうか,というのを判定します.
45
+
46
+ 判定は`Y[0]`から,`Y[0] - Y[1], Y[0] - Y[1], ..., Y[0] - Y[n-1]` としていきます(`n` は `len(Y)`).
47
+ 共通だと判定された時点で,`Y[0]` を 共通なグループに合併して,判定をやめて次(`Y[1]`)に移ります.
48
+ これを `Y[n-1]` まで行います
49
+
50
+ `Y[0]`について判定が終わった時点で,`Y[0]` に含まれていた数値は,
51
+ 1. `Y[1] .. Y[n]` に含まれている
52
+ 1. `Y[1] .. Y[n]` に含まれいない
53
+
54
+ のどちらかですが,いずれの場合もこれ以降`Y[0]`についての判定は必要ありません.
55
+
56
+ なので,内側のループは `i+1`からになっています.
57
+
58
+ 合併後に`Y[i].clear()` としているのは,後で削除しやすいように空のの `set` にしています.`Y[i] = set()` と同じです.

2

コード修正

2017/07/31 13:18

投稿

what_alnk
what_alnk

スコア147

answer CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  ```python
4
4
  X = [[0, 3, 7], [0, 9, 8], [1, 1, 6], [1, 8, 3], [0, 5, 9], [1, 1, 5], [0, 8, 3], [1, 8, 2]]
5
- # or
6
5
  # X = [[0, 3, 7], [0, 9, 8], [1, 1, 6], [1, 8, 3], [0, 5, 9], [1, 1, 5], [0, 8, 3], [1, 8, 2],[0, 2, 4]]
7
6
  Y = []
8
7
 
@@ -13,10 +12,10 @@
13
12
  print("hello")
14
13
 
15
14
  for i in range(len(Y) - 1):
16
- for j in range(i+1, len(Y)):
15
+ for j in range(i + 1, len(Y)):
17
- if len(Y[i] & Y[j]) > 0:
16
+ if not Y[i].isdisjoint(Y[j]):
18
- Y[j] = Y[i] | Y[j]
17
+ Y[j] |= Y[i]
19
- Y[i] = set()
18
+ Y[i].clear()
20
19
  break
21
20
 
22
21
  Y = list(filter(lambda x: len(x) > 0, [list(y) for y in Y]))

1

元のコードのエラーの原因と,回答のコードの解説を追加

2017/07/31 11:30

投稿

what_alnk
what_alnk

スコア147

answer CHANGED
@@ -24,4 +24,18 @@
24
24
  # [[3, 5, 7, 8, 9]]
25
25
  # or
26
26
  # [[3, 5, 7, 8, 9], [2, 4]]
27
- ```
27
+ ```
28
+
29
+ ---
30
+
31
+ エラーの原因は `xSet` が `set` ではないからなので,`xSet = set(X[i][1:3])` とすればエラーは消えます.
32
+ しかし,今のコードでは`temp` が毎回初期化されるので,エラーが消えてもアウトプット(`Y`)は
33
+
34
+ ```
35
+ [[8, 3, 7]]
36
+ ```
37
+
38
+ です.
39
+ また,今の方針だと,一度違うグループだと判定されたものが後から同じグループに属するようになった場合には対処できません.
40
+
41
+ なので,いったん 要素の`0`番目が`0`のものをすべて取り出しておいて,あとからもう一度ループを回して処理するという方針にしました.