2016-10-17 31 views
2

我有这样的数组,每个模式指定组合形状,每个数字代表组合的大小。查找数组和组合模式的组合

  • 图案0:[1, 1, 1, 1]
  • 图案1:[2, 1, 1]
  • 图案2:[3, 1]
  • 图案3:[4]
  • ...

我也有一个char值列表如下所示。 len(chars)等于上面数组的值的总和。

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

我想找到字符的所有组合给定模式下。例如,对于模式1,4C2 * 2C1 * 1C1是组合的数量。我不知道如何创建这样的组合数组。当然我知道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',)] 

注意上面,因为它使用yield from只与Python 3工作。

+0

这就是我想要做的!谢谢。 – jef