回答編集履歴

3

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

2017/07/31 13:18

投稿

what_alnk
what_alnk

スコア147

test CHANGED
@@ -77,3 +77,39 @@
77
77
 
78
78
 
79
79
  なので,いったん 要素の`0`番目が`0`のものをすべて取り出しておいて,あとからもう一度ループを回して処理するという方針にしました.
80
+
81
+
82
+
83
+ ---
84
+
85
+
86
+
87
+ Yの各要素について,自分以外の要素と共通な数値を持つかどうか,というのを判定します.
88
+
89
+
90
+
91
+ 判定は`Y[0]`から,`Y[0] - Y[1], Y[0] - Y[1], ..., Y[0] - Y[n-1]` としていきます(`n` は `len(Y)`).
92
+
93
+ 共通だと判定された時点で,`Y[0]` を 共通なグループに合併して,判定をやめて次(`Y[1]`)に移ります.
94
+
95
+ これを `Y[n-1]` まで行います
96
+
97
+
98
+
99
+ `Y[0]`について判定が終わった時点で,`Y[0]` に含まれていた数値は,
100
+
101
+ 1. `Y[1] .. Y[n]` に含まれている
102
+
103
+ 1. `Y[1] .. Y[n]` に含まれいない
104
+
105
+
106
+
107
+ のどちらかですが,いずれの場合もこれ以降`Y[0]`についての判定は必要ありません.
108
+
109
+
110
+
111
+ なので,内側のループは `i+1`からになっています.
112
+
113
+
114
+
115
+ 合併後に`Y[i].clear()` としているのは,後で削除しやすいように空のの `set` にしています.`Y[i] = set()` と同じです.

2

コード修正

2017/07/31 13:18

投稿

what_alnk
what_alnk

スコア147

test CHANGED
@@ -5,8 +5,6 @@
5
5
  ```python
6
6
 
7
7
  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]]
8
-
9
- # or
10
8
 
11
9
  # 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]]
12
10
 
@@ -28,13 +26,13 @@
28
26
 
29
27
  for i in range(len(Y) - 1):
30
28
 
31
- for j in range(i+1, len(Y)):
29
+ for j in range(i + 1, len(Y)):
32
30
 
33
- if len(Y[i] & Y[j]) > 0:
31
+ if not Y[i].isdisjoint(Y[j]):
34
32
 
35
- Y[j] = Y[i] | Y[j]
33
+ Y[j] |= Y[i]
36
34
 
37
- Y[i] = set()
35
+ Y[i].clear()
38
36
 
39
37
  break
40
38
 

1

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

2017/07/31 11:30

投稿

what_alnk
what_alnk

スコア147

test CHANGED
@@ -51,3 +51,31 @@
51
51
  # [[3, 5, 7, 8, 9], [2, 4]]
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ ---
58
+
59
+
60
+
61
+ エラーの原因は `xSet` が `set` ではないからなので,`xSet = set(X[i][1:3])` とすればエラーは消えます.
62
+
63
+ しかし,今のコードでは`temp` が毎回初期化されるので,エラーが消えてもアウトプット(`Y`)は
64
+
65
+
66
+
67
+ ```
68
+
69
+ [[8, 3, 7]]
70
+
71
+ ```
72
+
73
+
74
+
75
+ です.
76
+
77
+ また,今の方針だと,一度違うグループだと判定されたものが後から同じグループに属するようになった場合には対処できません.
78
+
79
+
80
+
81
+ なので,いったん 要素の`0`番目が`0`のものをすべて取り出しておいて,あとからもう一度ループを回して処理するという方針にしました.