寻找数组和组合模式的组合

2024-03-28 15:29:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 模式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中有很多有用的组合函数。但我不知道如何使用它们来创建组合数组。在

已编辑

很抱歉,我的解释令人费解。我举一个简单的例子。在

  • 模式0:[1, 1]
  • 模式1:[2]
  • chars = ['A', 'B']

那么,结果应该如下所示。所以第一维度应该是排列的,而第二维度应该是组合的。在

  • pat0:[['A'], ['B']]
  • pat0:[['B'], ['A']]
  • 第1部分:[['A', 'B']] # NOTE: [['B', 'A']] is same in my problem

Tags: 函数编辑列表len模式代表数字数组
1条回答
网友
1楼 · 发布于 2024-03-28 15:29:11

您可以使用递归函数,该函数接受模式中的第一个数字,并从剩余项生成该长度的所有组合。然后使用剩余的模式项和生成的前缀递归。一旦您使用了模式中的所有数字,只需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)

输出:

^{pr2}$

请注意,上面只适用于python3,因为它使用yield from。在

相关问题 更多 >