2016-10-17 2 views
2

У меня есть такие массивы, и каждый узор обозначает комбинационную форму с каждым числом, представляющим размер комбинации.Найти комбинации с массивами и комбинацией шаблонов

  • узор 0: [1, 1, 1, 1]
  • модель 1: [2, 1, 1]
  • модель 2: [3, 1]
  • модель 3: [4]
  • ...

У меня также есть символ-значный как показано ниже. len (chars) равно сумме значения верхнего массива.

chars = ['A', 'B', 'C', 'D']

Я хочу, чтобы найти все комбинации символов следуя заданному шаблону. Например, для шаблона 1, 4C2 * 2C1 * 1C1 - количество комбинаций.

[['A', 'B'], ['C'], ['D']] 
[['A', 'B'], ['D'], ['C']] 
[['A', 'C'], ['B'], ['D']] 
[['A', 'C'], ['D'], ['B']] 
[['A', 'D'], ['B'], ['C']] 
[['A', 'D'], ['C'], ['B']] 
... 

Но я не знаю, как создавать такие комбинационные массивы. Конечно, я знаю, что есть много полезных функций для комбинаций в python. Но я не знаю, как их использовать для создания комбинационного сочетания комбинаций.

EDITED

Я так сожалею, мое объяснение сбивает с толку. Я показываю простой пример.

  • узором 0: [1, 1]
  • модель 1: [2]
  • chars = ['A', 'B']

Затем, результат должен быть, как показано ниже. Поэтому первое измерение должно быть перестановкой, но второе измерение должно быть комбинацией.

  • pat0: [['A'], ['B']]
  • pat0: [['B'], ['A']]
  • pat1: [['A', 'B']] # NOTE: [['B', 'A']] is same in my problem

ответ

1

Вы можете использовать рекурсивную функцию, которая принимает первый номер в шаблоне и генерирует все комбинации этой длины от остальных пунктов , Затем рекурсия с оставшимся шаблоном & элементов и сгенерированный префикс. После того, как вы потребляли все номера в шаблоне только yield префикс все пути к абоненту:

from itertools import combinations 

pattern = [2, 1, 1] 
chars = ['A', 'B', 'C', 'D'] 

def patterns(shape, items, prefix=None): 
    if not shape: 
     yield prefix 
     return 

    prefix = prefix or [] 
    for comb in combinations(items, shape[0]): 
     child_items = items[:] 
     for char in comb: 
      child_items.remove(char) 
     yield from patterns(shape[1:], child_items, prefix + [comb]) 

for pat in patterns(pattern, chars): 
    print(pat) 

Выход:

[('A', 'B'), ('C',), ('D',)] 
[('A', 'B'), ('D',), ('C',)] 
[('A', 'C'), ('B',), ('D',)] 
[('A', 'C'), ('D',), ('B',)] 
[('A', 'D'), ('B',), ('C',)] 
[('A', 'D'), ('C',), ('B',)] 
[('B', 'C'), ('A',), ('D',)] 
[('B', 'C'), ('D',), ('A',)] 
[('B', 'D'), ('A',), ('C',)] 
[('B', 'D'), ('C',), ('A',)] 
[('C', 'D'), ('A',), ('B',)] 
[('C', 'D'), ('B',), ('A',)] 

Обратите внимание, что выше только работает с Python 3, так как он использует yield from.

+0

Это то, что я хочу! Спасибо. – jef

Смежные вопросы