Думая, как я пишу ... У вас есть набор ограничений, где вам нужен только один из (0,1), (2,3), (3,4) ... Предположим, что список четный в длину и то, что вы на самом деле хотели не включать самый первый элемент, который нарушает ограничение (0,1). Нечто подобное должно сработать:
import itertools
test_list = ['AW', 'BW', 'CW', 'DW', 'EW', 'FW', 'GW', 'HW']
# Your combinations can be obtained with itertools.combinations(test_list, 3)
def get_constraints(a, b, *rest):
return [(a, b), *(get_constraints(*rest) if rest else [])]
def constrained(combination_list, constraints):
for constraint in constraints:
if all((constraint_name in combination_list) for constraint_name in constraint):
return True
return False
def constrained_combinations(name_list):
combinations = itertools.combinations(name_list, 3)
constraints = get_constraints(*name_list)
return [combination for combination in combinations if not constrained(combination, constraints)]
constrained_combinations(test_list) ->
[('AW', 'CW', 'EW'),
('AW', 'CW', 'FW'),
('AW', 'CW', 'GW'),
('AW', 'CW', 'HW'),
('AW', 'DW', 'EW'),
('AW', 'DW', 'FW'),
('AW', 'DW', 'GW'),
('AW', 'DW', 'HW'),
('AW', 'EW', 'GW'),
('AW', 'EW', 'HW'),
('AW', 'FW', 'GW'),
('AW', 'FW', 'HW'),
('BW', 'CW', 'EW'),
('BW', 'CW', 'FW'),
('BW', 'CW', 'GW'),
('BW', 'CW', 'HW'),
('BW', 'DW', 'EW'),
('BW', 'DW', 'FW'),
('BW', 'DW', 'GW'),
('BW', 'DW', 'HW'),
('BW', 'EW', 'GW'),
('BW', 'EW', 'HW'),
('BW', 'FW', 'GW'),
('BW', 'FW', 'HW'),
('CW', 'EW', 'GW'),
('CW', 'EW', 'HW'),
('CW', 'FW', 'GW'),
('CW', 'FW', 'HW'),
('DW', 'EW', 'GW'),
('DW', 'EW', 'HW'),
('DW', 'FW', 'GW'),
('DW', 'FW', 'HW')]