回答編集履歴

1

ppaul さん ご指摘不具合の修正版

2021/09/22 04:08

投稿

lehshell
lehshell

スコア1156

test CHANGED
@@ -40,9 +40,87 @@
40
40
 
41
41
 
42
42
 
43
- あるいは次のコードかな
43
+ あるいは次のコードかな
44
+
45
+ ppaul さん ご指摘の不具合があったため別コードにしました。
46
+
47
+ ```Python
48
+
49
+ list1 = ['a', 'b', 'c']
50
+
51
+ list2 = ['d', 'f', 'e']
52
+
53
+ list3 = ['x', 'y', 'z']
54
+
55
+ list4 = ['b', 'f', 'g']
44
56
 
45
57
 
58
+
59
+ def merge_list(lst: [[]]) -> [[]]:
60
+
61
+ prelen = len(lst)
62
+
63
+ ovlp = [(i,k) for i in range(len(lst)) for k in range(i+1, len(lst)) if set(lst[i]) & set(lst[k])]
64
+
65
+ mono = set(range(len(lst))) - set(n for ov in ovlp for n in ov)
66
+
67
+ ans = [lst[i] for i in mono] + [sorted(set(lst[i]+lst[k])) for i,k in ovlp]
68
+
69
+ return ans if len(ans) == prelen else merge_list(ans)
70
+
71
+
72
+
73
+ lst = [ls[:2] for ls in (list1, list2, list3, list4)]
74
+
75
+ print(merge_list(lst)) # [['x', 'y'], ['a', 'b', 'd', 'f']]
76
+
77
+ ```
78
+
79
+ 不具合のあった旧コードベースで修正すると次のコードになります。
80
+
81
+ ```Python
82
+
83
+ list1 = ['a', 'b', 'c']
84
+
85
+ list2 = ['d', 'f', 'e']
86
+
87
+ list3 = ['x', 'y', 'z']
88
+
89
+ list4 = ['b', 'f', 'g']
90
+
91
+
92
+
93
+ def merge_list(lst: [[]]) -> [[]]:
94
+
95
+ prelen = len(lst)
96
+
97
+ ans = []
98
+
99
+ for ls in lst:
100
+
101
+ for i, elm in enumerate(ans):
102
+
103
+ if set(ls) & set(elm):
104
+
105
+ ans[i] = sorted(set(ls + elm))
106
+
107
+ break
108
+
109
+ else:
110
+
111
+ ans.append(sorted(ls))
112
+
113
+ return ans if len(ans) == prelen else merge_list(ans)
114
+
115
+
116
+
117
+ lst = [ls[:2] for ls in (list1, list2, list3, list4)]
118
+
119
+ print(merge_list(lst)) # [['a', 'b', 'd', 'f'], ['x', 'y']]
120
+
121
+ ```
122
+
123
+ 以下は不具合のある旧コードです。
46
124
 
47
125
  ```Python
48
126