以下のようにできます。
-
2つのグループにおおよそ等しく分割するとする。
例: 要素数4 -> 2個、2個、要素数5 -> 2個、3個
-
itertools.combinations で一方のグループのパターン (g1 とする) を列挙
-
配列から g1 を除いた要素がもう一方のグループ g2 となる。
-
(g1, g2) の組み合わせから重複するものは削除する。
例: ((1, 2), (3, 4)) と ((3, 4), (1, 2)) は同じ
4.1. まずグループをソートする。g1, g2 if g1 < g2 else g2, g1
例: ((1, 2), (3, 4)) も ((3, 4), (1, 2)) もソート後は ((1, 2), (3, 4)) になる。
4.2. set() で重複を消す。
python
1from itertools import combinations
2
3
4def split(array):
5 n_group1 = len(array) // 2 # 2つのうち、一方のグループの個数
6
7 g1 = list(combinations(array, 2)) # グループ1
8 print(g1) # [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
9
10 g2 = [tuple(set(array) - set(x)) for x in g1] # グループ2
11 print(g2) # [(3, 4), (2, 4), (2, 3), (1, 4), (1, 3), (1, 2)]
12
13 # 重複を除いた組み合わせ
14 pairs = set((x, y) if x < y else (y, x) for x, y in zip(g1, g2))
15 pairs = list(pairs)
16
17 return pairs
18
19array = [1, 2, 3, 4]
20
21pairs = split(array)
22print(pairs) # {((1, 3), (2, 4)), ((1, 4), (2, 3)), ((1, 2), (3, 4))}