Лучшее решение - в первую очередь избегать создания нежелательных комбинаций.
На самом деле это довольно просто, поскольку комбинации генерируются по порядку.Нам просто нужно взять первую половину из них.Из 8 (8 * 7 * 6 * 5 / (4 * 3 * 2)) 70 комбинаций по 4 балла, поэтому мы оставляем только первые 35 комбинаций.
Демонстрация, используя числа от 1до 8 вместо кортежей для удобства чтения:
from itertools import combinations, islice
l = [1, 2, 3, 4, 5, 6, 7, 8]
nb_combinations = 70
print(list(islice(combinations(l, 4), nb_combinations//2)))
Вывод:
[(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 3, 6), (1, 2, 3, 7), (1, 2, 3, 8),
(1, 2, 4, 5), (1, 2, 4, 6), (1, 2, 4, 7), (1, 2, 4, 8), (1, 2, 5, 6),
(1, 2, 5, 7), (1, 2, 5, 8), (1, 2, 6, 7), (1, 2, 6, 8), (1, 2, 7, 8),
(1, 3, 4, 5), (1, 3, 4, 6), (1, 3, 4, 7), (1, 3, 4, 8), (1, 3, 5, 6),
(1, 3, 5, 7), (1, 3, 5, 8), (1, 3, 6, 7), (1, 3, 6, 8), (1, 3, 7, 8),
(1, 4, 5, 6), (1, 4, 5, 7), (1, 4, 5, 8), (1, 4, 6, 7), (1, 4, 6, 8),
(1, 4, 7, 8), (1, 5, 6, 7), (1, 5, 6, 8), (1, 5, 7, 8), (1, 6, 7, 8)]
Вы можете видеть, что все эти 35 комбинаций содержат первое значение 1, поэтому мы уверены, что ни одна изони являются дополнением к другому из этого набора.101
Итак, ваша функция может быть записана:
from itertools import combinations, islice
def generate_4points(points):
# we only keep the first 35 combinations out of 70
return list(islice(combinations(points, 4), 35))