他のリストと重複しているものがあるときはまとめた上で必要な要素だけを抽出し、
他のリストと重複していないときは必要な要素だけを抽出したリストをそれぞれ作りたいです。
必要な要素 が 各リストの最初の2つ を意味し
他のリストと重複 が 他のリストと必要な部分で重複 を意味する場合
期待しているコードは
Python
1list1 = ['a', 'b', 'c']
2list2 = ['a', 'd', 'e']
3list3 = ['x', 'y', 'z']
4list4 = ['b', 'f', 'g']
5
6lst = [ls[:2] for ls in (list1, list2, list3, list4)]
7ovlp = [(i,k) for i in range(len(lst)) for k in range(i+1, len(lst)) if set(lst[i]) & set(lst[k])]
8mono = set(range(len(lst))) - set(n for ov in ovlp for n in ov)
9ans = [lst[i] for i in mono] + [sorted(set(lst[i]+lst[k])) for i,k in ovlp]
10print(ans) # [['x', 'y'], ['a', 'b', 'd'], ['a', 'b', 'f']]
あるいは次のコードかな。
ppaul さん ご指摘の不具合があったため別コードにしました。
Python
1list1 = ['a', 'b', 'c']
2list2 = ['d', 'f', 'e']
3list3 = ['x', 'y', 'z']
4list4 = ['b', 'f', 'g']
5
6def merge_list(lst: [[]]) -> [[]]:
7 prelen = len(lst)
8 ovlp = [(i,k) for i in range(len(lst)) for k in range(i+1, len(lst)) if set(lst[i]) & set(lst[k])]
9 mono = set(range(len(lst))) - set(n for ov in ovlp for n in ov)
10 ans = [lst[i] for i in mono] + [sorted(set(lst[i]+lst[k])) for i,k in ovlp]
11 return ans if len(ans) == prelen else merge_list(ans)
12
13lst = [ls[:2] for ls in (list1, list2, list3, list4)]
14print(merge_list(lst)) # [['x', 'y'], ['a', 'b', 'd', 'f']]
不具合のあった旧コードベースで修正すると次のコードになります。
Python
1list1 = ['a', 'b', 'c']
2list2 = ['d', 'f', 'e']
3list3 = ['x', 'y', 'z']
4list4 = ['b', 'f', 'g']
5
6def merge_list(lst: [[]]) -> [[]]:
7 prelen = len(lst)
8 ans = []
9 for ls in lst:
10 for i, elm in enumerate(ans):
11 if set(ls) & set(elm):
12 ans[i] = sorted(set(ls + elm))
13 break
14 else:
15 ans.append(sorted(ls))
16 return ans if len(ans) == prelen else merge_list(ans)
17
18lst = [ls[:2] for ls in (list1, list2, list3, list4)]
19print(merge_list(lst)) # [['a', 'b', 'd', 'f'], ['x', 'y']]
以下は不具合のある旧コードです。
Python
1list1 = ['a', 'b', 'c']
2list2 = ['a', 'd', 'e']
3list3 = ['x', 'y', 'z']
4list4 = ['b', 'f', 'g']
5
6lst = [ls[:2] for ls in (list1, list2, list3, list4)]
7ans = []
8for ls in lst:
9 for j, elm in enumerate(ans):
10 if set(ls) & set(elm):
11 ans[j] = sorted(set(ls + elm))
12 break
13 else:
14 ans.append(sorted(ls))
15
16print(ans) # [['a', 'b', 'd', 'f'], ['x', 'y']]