Создание комбинаций и удаление значений с условным аргументом - PullRequest
2 голосов
/ 04 марта 2020

Я работаю над комбинацией, используя Python. Допустим, у меня есть следующий список:

List = ['AW','BW','CW','DW','EW','FW','GW','HW']

Я создаю комбинации для любых 3 следующим образом:

Perm =combinations( List,3)
Com = []
for i in list(Perm): 
    #print (i)
    Com.append(i)

Я получил следующий вывод с 56 комбинациями:

enter image description here

Я хочу удалить комбинации со следующими условиями:

  1. Оба List [0] и List [1] содержатся в комбинация (т.е. я хочу, чтобы комбинации только с одним из этих двух содержались в комбинации.)

  2. Оба List [2] и List [3] содержатся в комбинации (т.е. я хочу комбинации только одна из этих двух содержится в комбинации.)

  3. Обе List [4] и List [5] содержатся в комбинации (т.е. я хочу, чтобы комбинации только с одной из этих двух содержать в комбинации.)

Это означает, что только один из двух последующих компонентов () списка должен содержаться в комбинации.

Я приложил изображение и выделил комбинации, которые будут удалены в качестве примеров.

enter image description here* 104 2 *

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Думая, как я пишу ... У вас есть набор ограничений, где вам нужен только один из (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')]
1 голос
/ 04 марта 2020

Вы можете сделать что-то вроде этого. Я не оптимизировал его.

List = ['AW','BW','CW','DW','EW','FW','GW','HW']

from itertools import combinations

Perm =combinations( List,3)
Com = []
s="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for i in list(Perm):
    if i[0][0]+i[1][0] not in s or i[1][0]+i[2][0] not in s:
        Com.append(i)
print len(Com), Com

Вы также можете упростить его.

...